Spring

Jackson Deserialization-잘못된 본문 유형이 성공적으로 역 직렬화 됨

기록만이살길 2021. 3. 9. 15:04
반응형

Jackson Deserialization-잘못된 본문 유형이 성공적으로 역 직렬화 됨

1. 질문(문제점):

내 REST 컨트롤러에 대한 POST 요청의 유효성을 검사하려고하는데 DTO 클래스에 대한 몇 가지 속성과 유효성 검사가 있습니다.

EmployeeDTOInput.java

@Getter
@Setter
public class EmployeeDTOInput {

  @NotBlank("name must not be blank!")
  private String name;

  @DecimalMin(value = "0.01", message = "salary must be greather than or equal to $0.01!")
  private BigDecimal salary;

  @NotNull("commission elegible must not be null!")
  private boolean commissionElegible;
}

또한 컨트롤러에 유효한 검사기가 있어야합니다.

@PostMapping
public EmployeeDTO store(@RequestBody @Valid EmployeeDTOInput employeeDTOInput) {
 // Controller logic
}

몇 가지 테스트를 작성하면서 JSON 요청 객체에이 구문이 있고 제대로 작동한다는 것을 알아 냈습니다.

{
  name: 12345,
  salary: "30000.50"
}

이런 종류의 요청을 거부 할 수있는 방법이 있습니까? 실제 DTO 속성에 따라 JSON 속성 유형의 100 % 일관성으로 만 수락하고 salary, 문자열 형식 만 수락 name하고 commissionElegible?

application.properties에 일부 Jackson 속성을 추가하려고 시도했습니다.

spring.jackson.deserialization.fail-on-unknown-properties=true
spring.jackson.deserialization.fail-on-ignored-properties=true
spring.jackson.deserialization.fail-on-invalid-subtype=true

그리고 DTO 클래스에 대한 일부 Jackson 어노테이션 :

@Getter
@Setter
public class EmployeeDTOInput {

  @JsonFormat(shape = JsonFormat.Shape.STRING)
  @NotBlank("name must not be blank!")
  private String name;
  
  @JsonFormat(shape = JsonFormat.Shape.NUMBER_FLOAT)
  @DecimalMin(value = "0.01", message = "salary must be greather than or equal to $0.01!")
  private BigDecimal salary;

  @JsonFormat(shape = JsonFormat.Shape.BOOLEAN)
  @NotNull("commission elegible must not be null!")
  private boolean commissionElegible;
}

그러나 요청은 여전히 ​​작동합니다.

이 '잘못된'역 직렬화를 방지하고 예외를 throw하도록 구성하는 방법이 있습니까?

2. 해결방안:

ObjectMapper의 ALLOW_COERCION_OF_SCALARS 속성을 구성해야한다고 생각합니다.

application.properties에서 설정을 변경하면됩니다.

spring.jackson.mapper.allow-coercion-of-scalars=false

다음은 JavaDoc입니다.

https://fasterxml.github.io/jackson-databind/javadoc/2.9/com/fasterxml/jackson/databind/MapperFeature.html#ALLOW_COERCION_OF_SCALARS

65730140
반응형