prosource

최신 Spring v4에서 옵션 본문과 함께 @RequestBody 사용

probook 2023. 8. 6. 10:11
반응형

최신 Spring v4에서 옵션 본문과 함께 @RequestBody 사용

사용할 때 REST API 호출에서 본문을 선택적으로 설정하려면 어떻게 합니까?@RequestBody봄에 주석을 달기?

Spring의 최신 버전과 함께, 만약 당신이@RequestBody주석을 사용하면 클라이언트가 선택 사항으로 만들지 않고 항상 본문을 전송할 수 있습니다.

나는 노력했다.@RequestBody (required=false)하지만 그것은 효과가 없었고 여전히 제 요청은 무효로 처리됩니다.

본문을 의무화하지 않고 요청을 적절한 필수 개체로 변환하려면 어떻게 해야 합니까?

예:

@RequestMapping(value="/add/employee", method=RequestMethod.POST)
public void addEmployee(@RequestBody Employee employee){
    // ...
}

여기서는 본문 없이 POST를 사용하는 직원을 추가하고 싶습니다.그걸 어떻게 하는 거죠?Spring 최신 버전에서 빈 본문을 보내면 "body missing" 오류가 발생합니다.

@산토시, 어떤 주장을 해야 하는지 잘 모르겠습니다.마이크는 이미 그가 사용하려고 시도했다고 언급했습니다.@RequestBody (required=false)그리고 요청은 여전히 무효였습니다.아마도 당신은 더 자세히 설명하고 예를 들어줄 수 있어요.

@마이크, 아마도 당신의 목적에 맞는 별도의 컨버터를 사용해 볼 수 있을 것입니다.

참고: Spring v4.1.6과 Mike가 최신 버전을 사용하고 있다고 언급한 것과 같은 문제를 발견했습니다.

버전에 문제가 있어서 3.2 이상의 스프링 버전을 사용하시는 것 같습니다.@RequestBody에 필수 매개 변수가 있어야 요청 본문을 선택할 수 있습니다.

다음 링크 Spring @RequestBody 주석 요청

@RequestBody기본적으로 참인 본문 및 인수가 필요합니다.false로 지정하면 도움이 됩니다.

공개 추상 부울이 필요합니다.

본문 내용이 필요한지 여부입니다.기본값은 true이며 본문 내용이 없는 경우 예외가 발생합니다.본문 내용이 null일 때 null을 전달하려면 false로 전환합니다.

사용할 수 있습니다.java.util.Optional:

@RequestMapping(value="/add/employee", method=RequestMethod.POST)
public void addEmployee(@RequestBody Optional<Employee> employee){
    // ...
}

엔티티로 표시된 Customer라는 클래스로 역직렬화하려는 비슷한 문제가 있었습니다.다른 엔티티를 가리키는 필드가 포함되어 있었기 때문입니다.

@Entity
public class Customer {
   // ...
   @OneToMany(mappedBy = "customer", cascade = CascadeType.ALL)
   @JsonManagedReference
   private List<Order> orders;
}

다음 끝점에 도달하려고 할 때 애플리케이션/json이 지원되지 않는다는 415 오류가 계속 발생했습니다.

@RestController
@RequestMapping("api/v1/customer")
public class Customer {
    // ...
    @PostMapping
    public void addNewCustomer(@RequestBody Customer cust) {
        customerService.createCustomer(cust);
    }
}

다음 작업으로 교체:

record NewCustomerRequest(String name) {}

@PostMapping
public void addNewCustomer(@RequestBody NewCustomerRequest request) {
    Customer cust = Customer.builder()
            .name(request.name())
            .build();
    customerService.createCustomer(cust);
}

언급URL : https://stackoverflow.com/questions/28687616/use-requestbody-with-optional-body-in-latest-spring-v4

반응형