콘텐츠로 이동

2021 05 31

2021-05-31

Jackson에 대해서

  • 기본 생성자는 필수다? (JSON->JavaObject)
    @Test
    public void readString() throws JsonProcessingException {
        final ObjectMapper objectMapper = new ObjectMapper();
        String json = "{ \"color\" : \"Black\", \"type\" : \"BMW\" }";
        Car car = objectMapper.readValue(json, Car.class);
        System.out.println(car.toString()); //Car{color='Black', type='BMW'}
    }
    
    class Car {
        private String color;
        private String type;
    
        public Car() {
        }
    
        public Car(String color, String type) {
            this.color = color;
            this.type = type;
        }
    
        public String getColor() {
            return color;
        }
    
        public String getType() {
            return type;
        }
    
        @Override
        public String toString() {
            return "Car{" +
                    "color='" + color + '\'' +
                    ", type='" + type + '\'' +
                    '}';
        }
    }
    

    - 여기에서 기본 생성자 Car()를 빼버리면 직렬화에 실패해버림 (리플렉션을 통해 값을 주입시켜주는 것은 아닐까?)

    Cannot construct instance of `Car` (no Creators, like default constructor, exist): cannot deserialize from Object value (no delegate- or property-based Creator)
     at [Source: (String)"{ "color" : "Black", "type" : "BMW" }"; line: 1, column: 3]
    

      - 해결책1. 기본생성자 만들기
      - 해결책2. `@JsonProperty`
      ```java
      public Car2(
              @JsonProperty("color") String color,
              @JsonProperty("type") String type) {
          this.color = color;
          this.type = type;
      }
      ```
    
      - 해결책3. `@ConstructorProperties`
    
    • Getter는 필수다? (JSON->JavaObject)
      • 그냥 JavaObject에서는 뻗음
      • @JsonProperty하면 안뻗음
  • @JsonProperty

Swagger

  • 참고: https://jojoldu.tistory.com/31
    // swagger
    compile group: 'io.springfox', name: 'springfox-swagger2', version: '2.9.2'
    compile group: 'io.springfox', name: 'springfox-swagger-ui', version: '2.9.2'
    
    //SwaggerConfig.java
    @Configuration
    @EnableSwagger2
    public class SwaggerConfig {
        @Bean
        public Docket api() {
            return new Docket(DocumentationType.SWAGGER_2)
                    .groupName("subway")
                    .select()
                    .apis(RequestHandlerSelectors.basePackage("wooteco.subway"))
                    .paths(PathSelectors.any())
                    .build();
        }
    }
    

    - 각 Controller에 @Api(tags = "설명설명")을 붙여 설명 제공 - PathController 같은 경우 노출을 막기 위해 @ApiIgnore 설정해둠 - 현재 배포된 Swagger 문서 - https://joel-subway.kro.kr/swagger-ui.html