복붙노트

[SPRING] DELETE 요청 본문에 데이터 전달

SPRING

DELETE 요청 본문에 데이터 전달

두 개의 스프링 MVC 컨트롤러 메서드가 있습니다. 둘 다 요청 본문 (HTLM POST 형식의 형식 : version = 3 & name = product1 & id = 2)에서 동일한 데이터를 받지만 한 가지 메소드는 PUT 요청과 다른 DELETE를 처리합니다.

@RequestMapping(value = "ajax/products/{id}", method = RequestMethod.PUT)
@ResponseBody
public MyResponse updateProduct(Product product, @PathVariable("id") int productId) {

//...
}

@RequestMapping(value = "ajax/products/{id}", method = RequestMethod.DELETE)
@ResponseBody
public MyResponse updateProduct(Product product, @PathVariable("id") int productId) {

//...
}

첫 번째 방법에서는 제품 인수의 모든 필드가 올바르게 초기화됩니다. 두 번째에서는 id 필드 만 초기화됩니다. 다른 필드는 널 또는 0입니다 (id는 아마 id 경로 변수로 인해 초기화 됨).

HttpServletRequest 객체가 요청 본문 (version = 3 & name = product1 & id = 2)의 모든 필드에 대한 값을 포함하고 있음을 알 수 있습니다. 그것들은 단지 product 매개 변수의 필드에 매핑되지 않습니다.

두 번째 방법을 어떻게 작동시킬 수 있습니까?

또한 @RequestParam 주석 매개 변수를 사용하려고했습니다. PUT 요청을 처리하는 메서드에서 작동합니다. DELETE 메소드에서 예외가 발생합니다 : org.springframework.web.bind.MissingServletRequestParameterException : 필수 String 파라미터 'version'이 없습니다.

데이터가 낙관적 인 잠금에 사용되는 행 버전을 포함하므로 DELETE 요청 본문에 데이터를 전달해야합니다.

해결법

  1. ==============================

    1.문제는 Spring 문제는 아니지만 Tomcat 문제입니다.

    문제는 Spring 문제는 아니지만 Tomcat 문제입니다.

    기본적으로 Tomcat은 HTTP 메소드가 POST 일 때 양식 스타일의 인수 만 구문 분석합니다 (최소한 확인한 버전 7.0.54에서는 모든 Tomcat 7 버전에서 동일 할 것입니다).

    DELETE 메소드를 처리 할 수 ​​있으려면 Tomcat Connector의 parseBodyMethods 속성을 설정해야합니다. 커넥터 구성은 server.xml에서 수행됩니다.

    업데이트 된 커넥터의 모양은 다음과 같습니다.

    <Connector port="8080" protocol="HTTP/1.1" 
               connectionTimeout="20000"
               redirectPort="8443"
               parseBodyMethods="POST,PUT,DELETE"
               URIEncoding="UTF-8" />
    

    다음은 Tomcat 커넥터 구성을위한 문서 페이지입니다.

    일단 매개 변수를 파싱하도록 Tomcat을 설정하면 Spring은 잘 작동 할 것이지만 (아마도 컨트롤러 메소드에서 @RequestBody를 제거해야 할 것이다)

  2. ==============================

    2.@RequestBody 주석을 Product 인수에 추가해볼 수 있습니다.

    @RequestBody 주석을 Product 인수에 추가해볼 수 있습니다.

    그러나 버전 정보 만 전달하면됩니다. 요청 매개 변수를 사용하는 것이 더 적절합니다.

    그래서 당신의 delete 메소드 @RequestParam ( "version") int version에 새로운 인수를 추가하고, delete 메소드를 호출 할 때 ..ajax / products / 123? version = 1 같은 쿼리 매개 변수를 전달하십시오.

    요청 param이 삭제에서 작동하지 않는다고 했으므로 정확한 URL과 메소드 서명을 게시 할 수 있습니까?

  3. ==============================

    3.봄 부팅 1.5. *

    봄 부팅 1.5. *

    @Bean
    public TomcatEmbeddedServletContainerFactory tomcatEmbeddedServletContainerFactory() {
        return new TomcatEmbeddedServletContainerFactory(){
            @Override
            protected void customizeConnector(Connector connector) {
                super.customizeConnector(connector);
                connector.setParseBodyMethods("POST,PUT,DELETE");
            }
        };
    }
    
  4. from https://stackoverflow.com/questions/25375046/passing-data-in-the-body-of-a-delete-request by cc-by-sa and MIT license