๊ด€๋ฆฌ ๋ฉ”๋‰ด

Coding Planet

No serializer found for class - @JsonProperty๋กœ ํ•ด๊ฒฐ ๋ณธ๋ฌธ

๐Ÿ’ป Java Study

No serializer found for class - @JsonProperty๋กœ ํ•ด๊ฒฐ

jhj.sharon 2023. 10. 18. 09:46
๋ฐ˜์‘ํ˜•

 ๊ฐœ๋ฐœ ๊ณผ์ •์—์„œ ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์˜ค๋ฅ˜ ๋ฐœ์ƒ

cohttp://m.fasterxml.jackson.databind.exc.InvalidDefinitionException: No serializer found for class cohttp://m.example.demo.main.domain.Menu and no properties discovered to create BeanSerializer (to avoid exception, disable SerializationFeature.FAIL_ON_EMPTY_BEANS) (through reference chain: java.util.ArrayList[0])

1. ๋ฌธ์ œ ์›์ธ

์Šคํ”„๋ง ๋ถ€ํŠธ๋Š” ๊ธฐ๋ณธ์ ์œผ๋กœ JSON ๋ฐ์ดํ„ฐ์™€ Java ๊ฐ์ฒด ๊ฐ„์˜ ๋ณ€ํ™˜์„ ๋‹ด๋‹นํ•˜๋Š” ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋กœ Jackson์„ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ๋‹ค. Jackson์€ Java ๊ฐ์ฒด๋ฅผ JSON์œผ๋กœ ๋ณ€ํ™˜(Serialize)ํ•˜๊ฑฐ๋‚˜ JSON์„ Java ๊ฐ์ฒด๋กœ ๋ณ€ํ™˜(Deserialize)ํ•˜๋Š” ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•œ๋‹ค.

์ด ๋ณ€ํ™˜ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•  ๋•Œ, Jackson์€ Java ๊ฐ์ฒด์˜ ํ•„๋“œ์— ์ง์ ‘ ์ ‘๊ทผํ•˜๊ธฐ ๋ณด๋‹ค๋Š” ํ•ด๋‹น ๊ฐ์ฒด์˜ getter ๋ฐ setter ๋ฉ”์†Œ๋“œ๋ฅผ ์ด์šฉํ•˜๋Š”๋ฐ ๋งŒ์•ฝ Java ๊ฐ์ฒด์˜ ํ•„๋“œ๊ฐ€ `private`๋กœ ์„ ์–ธ๋˜์–ด ์žˆ๊ณ  ํ•ด๋‹น ํ•„๋“œ์— ๋Œ€ํ•œ getter๋‚˜ setter ๋ฉ”์†Œ๋“œ๊ฐ€ ์ œ๊ณต๋˜์ง€ ์•Š๋Š”๋‹ค๋ฉด, Jackson์€ ํ•ด๋‹น ํ•„๋“œ์— ์ ‘๊ทผํ•  ์ˆ˜ ์—†๊ฒŒ ๋œ๋‹ค. ๊ทธ ๊ฒฐ๊ณผ๋กœ, ์ด ๊ฐ์ฒด๋ฅผ JSON์œผ๋กœ ๋ณ€ํ™˜ํ•˜๋Š” ๊ณผ์ •์—์„œ ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•˜๊ฒŒ ๋œ๋‹ค.

์š”์•ฝํ•˜์ž๋ฉด, Jackson์€ Java ๊ฐ์ฒด์˜ private ํ•„๋“œ์— ์ ‘๊ทผํ•˜๊ธฐ ์œ„ํ•ด getter์™€ setter ๋ฉ”์†Œ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜๋ฏ€๋กœ, ํ•ด๋‹น ๋ฉ”์†Œ๋“œ๊ฐ€ ์—†์„ ๊ฒฝ์šฐ JSON ๋ณ€ํ™˜ ๊ณผ์ •์—์„œ ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ๊ฒƒ์ด๋‹ค.

2. ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•

๋ฌธ์ œ ์›์ธ์— ๋”ฐ๋ผ Jackson์ด Java ๊ฐ์ฒด์— ์ •์ƒ์ ์œผ๋กœ ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•ด์ฃผ๋ฉด ๋œ๋‹ค. 1) ObjectMapper ์ธ์Šคํ„ด์Šค์—์„œ private ํ•„๋“œ ์ ‘๊ทผ์ด ๊ฐ€๋Šฅํ•˜๋„๋ก ํ•˜๊ฑฐ๋‚˜ 2)@JsonProperty๋ฅผ ์‚ฌ์šฉํ•˜๊ฑฐ๋‚˜ 3)@JasonAutoDetect๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ๋œ๋‹ค.

์ด๋ฒˆ ์˜ค๋ฅ˜์˜ ๊ฒฝ์šฐ @JsonProperty๋กœ ํ•ด๊ฒฐํ–ˆ๋‹ค.

 

3. @JsonProperty์˜ ์ฃผ์š”๊ธฐ๋Šฅ

  1. ํ•„๋“œ ์ด๋ฆ„ ๋ณ€๊ฒฝ : ๊ฐ์ฒด๋ฅผ JSON์œผ๋กœ ์ง๋ ฌํ™”ํ•  ๋•Œ ์‚ฌ์šฉํ•  ํ”„๋กœํผํ‹ฐ ์ด๋ฆ„์„ ์ง€์ •ํ•˜๊ฑฐ๋‚˜, JSON์„ ๊ฐ์ฒด๋กœ ์—ญ์ง๋ ฌํ™”ํ•  ๋•Œ ์‚ฌ์šฉํ•  ํ”„๋กœํผํ‹ฐ ์ด๋ฆ„์„ ์ง€์ •ํ•œ๋‹ค. ์ด๋ฅผ ํ†ตํ•ด Java ํ•„๋“œ ์ด๋ฆ„๊ณผ JSON ํ”„๋กœํผํ‹ฐ ์ด๋ฆ„ ์‚ฌ์ด์˜ ๋งคํ•‘์„ ๋ณ€๊ฒฝํ•  ์ˆ˜ ์žˆ๋‹ค.
   public class User {
       @JsonProperty("user_name")
       private String username;
   }

์œ„ ์˜ˆ์ œ์—์„œ, Java ๊ฐ์ฒด๋ฅผ JSON์œผ๋กœ ๋ณ€ํ™˜ํ•˜๋ฉด {"user_name":"...value..."} ํ˜•ํƒœ์˜ JSON์ด ์ƒ์„ฑ๋œ๋‹ค.

 

  1. ์ง๋ ฌํ™”/์—ญ์ง๋ ฌํ™” ์‹œ ์ ‘๊ทผ ์ œ์–ด: @JsonProperty๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ํŠน์ • ํ•„๋“œ๊ฐ€ ์ง๋ ฌํ™” ๋ฐ/๋˜๋Š” ์—ญ์ง๋ ฌํ™” ๋˜๋Š” ๊ฒƒ์„ ์ œ์–ดํ•  ์ˆ˜ ์žˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, @JsonProperty(access = Access.WRITE_ONLY)๋Š” ํ•ด๋‹น ํ•„๋“œ๊ฐ€ ์ง๋ ฌํ™”๋˜์ง€ ์•Š๊ฒŒ ํ•˜์ง€๋งŒ ์—ญ์ง๋ ฌํ™”์—๋Š” ๋ฌธ์ œ๊ฐ€ ์—†๊ฒŒ ํ•ฉ๋‹ˆ๋‹ค.
  2. ์„ ํƒ์  ์‚ฌ์šฉ: ํ•„์ˆ˜์ ์œผ๋กœ ์ง๋ ฌํ™”/์—ญ์ง๋ ฌํ™”ํ•ด์•ผ ํ•˜๋Š” ํ”„๋กœํผํ‹ฐ๋ฅผ ๋ช…์‹œํ•˜๊ธฐ ์œ„ํ•ด @JsonProperty(required = true)๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋ ‡๊ฒŒ ์„ค์ •ํ•˜๋ฉด ํ•ด๋‹น ํ”„๋กœํผํ‹ฐ๊ฐ€ ์—†๋Š” JSON์„ ์—ญ์ง๋ ฌํ™”ํ•˜๋ ค๊ณ  ํ•˜๋ฉด ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•œ๋‹ค.
  3. ์ˆœ์„œ ์ง€์ •: @JsonPropertyOrder ์–ด๋…ธํ…Œ์ด์…˜๊ณผ ํ•จ๊ป˜ ์‚ฌ์šฉํ•˜์—ฌ JSON ์ง๋ ฌํ™” ์‹œ ํ”„๋กœํผํ‹ฐ์˜ ์ˆœ์„œ๋ฅผ ์ง€์ •ํ•  ์ˆ˜ ์žˆ๋‹ค.

 

๋ฐ˜์‘ํ˜•
Comments