๐ŸคชJackson ์˜ˆ์™ธ : MismatchedInputException์™€ ๊ธฐํƒ€ ์˜ˆ์™ธ

NtoZยท2023๋…„ 7์›” 16์ผ
0

CodeStates

๋ชฉ๋ก ๋ณด๊ธฐ
4/4

- ๐Ÿค” MismatchedInputException : ์˜ˆ์™ธ ๋ฐœ์ƒ

  • ๋กœ๊ทธ์ธ ์ธ์ฆ์š”์ฒญ ์‹คํŒจ

  • ์•„๋ž˜์™€ ๊ฐ™์€ ์˜ˆ์™ธ ๋ฐœ์ƒ

com.fasterxml.jackson.databind.exc.MismatchedInputException: Cannot construct instance of `com.codestates.auth.dto.LoginDTO` (although at least one Creator exists): no String-argument constructor/factory method to deserialize from String value ('username')
 at [Source: (org.apache.catalina.connector.CoyoteInputStream); line: 1, column: 1]
	at com.fasterxml.jackson.databind.exc.MismatchedInputException.from(MismatchedInputException.java:63) ~[jackson-databind-2.13.3.jar:2.13.3]

  • ๊ธฐ๋ณธ์ƒ์„ฑ์ž๊ฐ€ ์—†์–ด์„œ ๋ฐœ์ƒํ•˜๋Š” ์˜ค๋ฅ˜๊ฐ€ ๋งž๋‚˜? ๋””ํดํŠธ ์ƒ์„ฑ์ž๋Š” ๋ณ„๋„ ์ƒ์„ฑ์ž๊ฐ€ ์—†์„ ๋•Œ ์ปดํŒŒ์ผ๋Ÿฌ๊ฐ€ ์ž๋™์œผ๋กœ ์ถ”๊ฐ€ํ•ด์ฃผ๋Š” ๊ฒƒ์œผ๋กœ ์•Œ๊ณ  ์žˆ๋Š”๋ฐ.

  • ํ˜น์‹œ ๋ชจ๋ฅด๋‹ˆ๊นŒ ๊ธฐ๋ณธ ์ƒ์„ฑ์ž๋ฅผ ์ถ”๊ฐ€ํ•ด์ฃผ๋„๋ก ํ•˜์ž.

  • ์ด๋ฒˆ์—” ๋‹ค๋ฅธ ์˜ˆ์™ธ๊ฐ€ ์ถœ๋ ฅ๋˜์—ˆ๋‹ค. : successfulAuthentication()์—์„œ Authentication ๊ฐ์ฒด์— MemberDetails ๊ฐ์ฒด ์ •๋ณด๊ฐ€ ๋‹ด๊ธฐ์ง€ ์•Š์•„์„œ ๋ฐœ์ƒํ•˜๋Š” ํ˜•๋ณ€ํ™˜ ์˜ˆ์™ธ

java.lang.ClassCastException: class java.lang.String cannot be cast to class com.codestates.member.entity.Member 
(java.lang.String is in module java.base of loader 'bootstrap'; com.codestates.member.entity.Member is in unnamed module of loader 'app')
  • java.lang.ClassCastException: class java.lang.String cannot be cast to class com.codestates.member.entity.Member

    • String ํด๋ž˜์Šค๋ฅผ Member ์—”ํ‹ฐํ‹ฐ๋กœ ํ˜•๋ณ€ํ™˜ํ•  ์ˆ˜ ์—†๋‹ค๊ณ  ํ•œ๋‹ค.
  • JwtAuthenticationFilter.java:55

    Member member = (Member) authResult.getPrincipal();ใ…ก๊ณผ์ •์—์„œ ํ˜•๋ณ€ํ™˜ ์˜ˆ์™ธ๊ฐ€ ๋ฐœ์ƒํ–ˆ๋‹ค. authResult๊ฐ€ String์ด๋ผ Member๋กœ ๋งคํ•‘ํ•˜์ง€ ๋ชปํ–ˆ๋‹ค๋Š” ๋œป ๊ฐ™์€๋ฐ getPrincipal()์˜ ๋ฐ˜ํ™˜ํƒ€์ž…์€ ์›๋ž˜ ๋ฌด์—‡์ผ๊นŒ?
    ์ฐพ์•„๋ณด๋‹ˆ ์›๋ž˜๋Š” Object ํƒ€์ž…์œผ๋กœ ๋ฐ˜ํ™˜๋˜์–ด์•ผ ํ•œ๋‹ค๊ณ  ํ•œ๋‹ค.
    ์–ด๋””์— ๋ฌธ์ œ๊ฐ€ ์žˆ์„๊นŒ?

  • ๋ ˆํผ๋Ÿฐ์Šค ์ฝ”๋“œ์—์„œ Member member = (Member) authResult.getPrincipal();๋ฅผ ๋””๋ฒ„๊น…ํ•ด๋ณด๋ฉด MemberDetailsService๊ฐ€ ๋งŒ๋“  MemberDetails ๊ฐ์ฒด๊ฐ€ ์กด์žฌํ•จ์„ ์•Œ ์ˆ˜ ์žˆ์ง€๋งŒ,

    ๋‚ด ์ฝ”๋“œ์—์„œ Member member = (Member) authResult.getPrincipal();๋ฅผ ๋””๋ฒ„๊น…ํ•ด๋ณด๋ฉด

    principal ํ•„๋“œ์— MemberDetails ๊ฐ์ฒด๊ฐ€ ์•„๋‹Œ username๋งŒ ๋ณด์œ ํ•˜๊ณ  ์žˆ๋Š” ๊ฒƒ์„ ์•Œ ์ˆ˜ ์žˆ๋‹ค.


  • ๋ฌธ์ œ์˜ ์›์ธ์„ ์ฐพ์•„๋ดค๋”๋‹ˆ MemberDetailsService ํด๋ž˜์Šค์— @Component๊ฐ€ ์•ˆ๋ถ™์€ ๊ฒƒ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ์—ˆ๋‹ค.

    ๋‹ค์‹œ @Component๋ฅผ ๋ถ™์—ฌ์ฃผ์—ˆ๋‹ค.

  • ๊ทธ๋ž˜๋„ ์—ฌ์ „ํžˆ ํ•ด๋‹น ํŒŒํŠธ(2๏ธโƒฃ ๋กœ๊ทธ์ธ ์ธ์ฆ ์š”์ฒญ)์—์„œ ์˜ˆ์™ธ๊ฐ€ ์ถœ๋ ฅ๋œ๋‹ค.


    ์—ฌ์ „ํžˆ principal์— MemberDetailsService์—์„œ ๋ฐœํ–‰ํ•˜๋Š” MemberDetails๊ฐ€ ์ถœ๋ ฅ๋˜์ง€ ์•Š๋Š”๋‹ค.


  • ๋‹ค์‹œ ๋ณด๋‹ˆ ๋‚ด ์ฝ”๋“œ์—์„œ๋Š” MemberDetailsService๊ฐ€ UserDetailsService๋ฅผ ๊ตฌํ˜„ํ•˜์ง€๋„ ์•Š์•˜๋‹ค๋Š” ๊ฒƒ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ์—ˆ๋‹ค.

    ๋‹ค์‹œ UserDetailsService๋ฅผ ๊ตฌํ˜„ํ•˜๊ณ  ๋””๋ฒ„๊น…ํ•ด๋ณด์ž.

    ์—ฌ์ „ํžˆ ๊ฐ™์€ ์˜ค๋ฅ˜๊ฐ€ ์ถœ๋ ฅ๋œ๋‹ค.

  • ๋กœ๊ทธ์ธ DTO๋กœ๋ถ€ํ„ฐ ๋””๋ฒ„๊น…์„ ๋Œ๋ ค๋ณด๋‹ˆ

    return authenticationManager.authenticate(authenticationToken);ํ•˜๋Š” ๊ฒƒ์ด ์•„๋‹Œ return authenticationToken์ด attemptAuthentication()์˜ ๊ฒฐ๊ณผ๋กœ ๋„˜์–ด๊ฐ€๋Š” ๊ฒƒ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ์—ˆ๋‹ค.

    โญ์ธ์ฆํ† ํฐ์ด AuthenticationManer์˜ authenticate๋ฅผ ๊ฑฐ์ณ์„œ ๋ฐ˜ํ™˜๋˜๋„๋ก ๋‹ค์‹œ ์ž‘์„ฑํ•ด์คฌ๋‹ค.

    ๋“œ๋””์–ด ์ •์ƒ์ ์œผ๋กœ ๊ฐ’์ด ์ „๋‹ฌ๋˜๋Š”๊ฒƒ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ์—ˆ๋‹ค.



profile
9์—์„œ 0์œผ๋กœ, ๋ฐฑ์—”๋“œ ๊ฐœ๋ฐœ๋ธ”๋กœ๊ทธ

0๊ฐœ์˜ ๋Œ“๊ธ€