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가지 측면이 있습니다.
- 필수 필드가 없는 경우 4XX를 반환할 필요가 있습니다(이는 이미 주어진 답변으로 달성할 수 있습니다).
@NonNull
/@NonEmpty
와 함께@Validate
주석 - 알 수 없는 필드가 있는 경우 오류 발생을 방지하려고 합니다.
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
'programing' 카테고리의 다른 글
자동 완성 요구/서버 응답은 어떻게 되어 있습니까? (0) | 2023.04.01 |
---|---|
Jest를 사용한 후크를 사용한 리액트 기능 컴포넌트 테스트 (0) | 2023.04.01 |
REST 보증 - 범용 리스트의 시리얼화 해제 (0) | 2023.04.01 |
리액트 훅 - show Component Update를 구현하려면 어떻게 해야 합니까? (0) | 2023.04.01 |
larabel과 같은 자체 DD() 함수를 쓰는 방법은 무엇입니까? (0) | 2023.04.01 |