programing

Springboot - validate @RequestBody

linuxpc 2023. 4. 1. 08:31
반응형

Springboot - validate @RequestBody

질문:.구체적으로 if 스테이트먼트를 작성하지 않고 요청 본문의 JSON 페이로드 검증이 가능합니까?주석이나 구성을 통해요?

저는 매우 쉬운 POJO를 가지고 있습니다.

public class Foo {

    private int important;
    private String something;

//constructors, getter, seters, toString
}

또한 매우 쉬운 컨트롤러 클래스:

@SpringBootApplication
@RestController
public class QuestionController {

    public static void main(String[] args) {
        SpringApplication.run(QuestionController.class, args);
    }

    @GetMapping(value = "/question")
    Mono<String> question(@RequestBody Foo foo) {
        System.out.println("The object foo, with value for important = " + foo.getImportant() + " and something = " + foo.getSomething());
        return Mono.just("question");
    }

}

다음과 같은 payload를 사용하여 쿼리하는 경우

{
    "important": 42,
    "something": "value"
}

모든 것이 완벽하게 잘 작동하고 있습니다. 매우 행복합니다.

단, 오타가 있는 경우: ('중요'에 오타가 있는 경우)

{
    "importantWithTypo": 42,
    "something": "value"
}

또는 필요한 "중요"가 존재하지 않는 경우(JSON은 완전하지 않음)

{
    "something": "value"
}

요청 및 계산이 여전히 유효합니다!그리고 "important"의 값은 0입니다!

나는 스프링이 0으로 디폴트 되는 것을 원하지 않고 모든 것이 정상이라고 생각한다.

또한 기본 개체에서 상자형 개체로 유형을 변경하고 싶지 않습니다.

내가 이런 글을 쓸 필요 없이:

 @GetMapping(value = "/question")
    Mono<String> question(@RequestBody Foo foo) {
        if (0 == foo.getImportant()) {
            throw new IllegalArgumentException();
        }
        System.out.println("The object foo, with value for important = " + foo.getImportant() + " and something = " + foo.getSomething());
        return Mono.just("question");
    }

이 문제를 해결하는 가장 효율적인 방법은 무엇입니까?주석 같은 거?아니면 스프링 부트 구성?

감사해요.

필드에 @NotNull 주석을 추가하고(유형을 Integer로 변경해야 할 수 있음), 컨트롤러의 메서드 파라미터에 @Valid 주석을 추가합니다.

Mono<String> question(@Valid @RequestBody Foo foo) {
    ...
}
public class Foo {

    @NotNull
    private Integer important;
    private String something;

//constructors, getter, seters, toString
}

상세한 것에 대하여는, https://lmonkiewicz.medium.com/the-power-of-spring-rest-api-validation-77be83edef 를 참조해 주세요.

이미 제공된 답변은 질문에 대한 답변입니다.

하지만 저는 당신이 물어본 한 가지에 대해 자세히 말씀드리고 싶습니다.

실패하는 방법"importantWithTypo": 42,

2가지 측면이 있습니다.

  1. 필수 필드가 없는 경우 4XX를 반환할 필요가 있습니다(이는 이미 주어진 답변으로 달성할 수 있습니다).@NonNull/@NonEmpty와 함께@Validate주석
  2. 알 수 없는 필드가 있는 경우 오류 발생을 방지하려고 합니다.importantWithTypo이건 잭슨이 할 수 있는 일이니까fail_on_unknown_properties소유물.(디폴트일 수 있습니다).fail_on_unknown_properties = enabled아직 확인하지 않았기 때문에 잘 모르겠습니다).

번째 거 하지.이것에 의해, 2개의 서비스가 밀접하게 결합됩니다.이렇게 함으로써fail_on_unknown_properties = enabled고객님은 컨슈머/가정 서비스를 중단 없이 강화할 수 있는 기회를 상실하고 있습니다.그런 다음 엔티티에 새로운 속성을 도입할 경우 생산자/공급자가 출시할 때까지 소비자 출시가 유지되도록 두 앱의 출시를 조정해야 합니다.롤백도 마찬가지로 이번에는 역순으로 진행됩니다.

언급URL : https://stackoverflow.com/questions/64517537/springboot-validate-requestbody

반응형