[SPRING] DELETE 요청 본문에 데이터 전달
SPRINGDELETE 요청 본문에 데이터 전달
두 개의 스프링 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.문제는 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.@RequestBody 주석을 Product 인수에 추가해볼 수 있습니다.
@RequestBody 주석을 Product 인수에 추가해볼 수 있습니다.
그러나 버전 정보 만 전달하면됩니다. 요청 매개 변수를 사용하는 것이 더 적절합니다.
그래서 당신의 delete 메소드 @RequestParam ( "version") int version에 새로운 인수를 추가하고, delete 메소드를 호출 할 때 ..ajax / products / 123? version = 1 같은 쿼리 매개 변수를 전달하십시오.
요청 param이 삭제에서 작동하지 않는다고 했으므로 정확한 URL과 메소드 서명을 게시 할 수 있습니까?
-
==============================
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"); } }; }
from https://stackoverflow.com/questions/25375046/passing-data-in-the-body-of-a-delete-request by cc-by-sa and MIT license
'SPRING' 카테고리의 다른 글
[SPRING] Spring에서 javax.inject.Provider를 사용해야 할 때? (0) | 2019.03.13 |
---|---|
[SPRING] Spring 데이터로 읽기 전용 저장소 만들기 (0) | 2019.03.13 |
[SPRING] Spring Rest 서비스와 Jersey Rest Service 및 Spring + Jersey 솔루션의 차이점은 무엇입니까? (0) | 2019.03.13 |
[SPRING] Spring 데이터 JPA. findAll () 메소드에서 ID 목록 만 얻는 방법 (0) | 2019.03.13 |
[SPRING] 스프링의 공유 EntityManager에서 트랜잭션을 수동으로 시작하는 방법은 무엇입니까? (0) | 2019.03.13 |