[SPRING] 스프링 JSON 요청 본문이 Java POJO에 매핑되지 않았습니다.
SPRING스프링 JSON 요청 본문이 Java POJO에 매핑되지 않았습니다.
RESTful 웹 서비스를 구현하기 위해 Spring을 사용하고 있습니다. 하나의 엔드 포인트는 요청 본문으로 JSON 문자열을 받아 POJO에 매핑하려고합니다. 그러나 전달 된 JSON 문자열은 POJO에 매핑 된 속성이 아닙니다.
@RestController 인터페이스는 다음과 같습니다.
@RequestMapping(value="/send", headers="Accept=application/json", method=RequestMethod.POST)
public void sendEmails(@RequestBody CustomerInfo customerInfo);
데이터 모델
public class CustomerInfo {
private String firstname;
private String lastname;
public CustomerInfo() {
this.firstname = "first";
this.lastname = "last";
}
public CustomerInfo(String firstname, String lastname)
{
this.firstname = firstname;
this.lastname = lastname;
}
public String getFirstname(){
return firstname;
}
public void setFirstname(String firstname){
this.firstname = firstname;
}
public String getLastname(){
return lastname;
}
public void getLastname(String lastname){
this.lastname = lastname;
}
}
마지막으로 POST 요청 :
{"CustomerInfo":{"firstname":"xyz","lastname":"XYZ"}}
Content-Type이 application / json으로 지정된 경우
그러나 개체 값을 출력 할 때 전달 된 값 ( "xyz"및 "XYZ") 대신 기본값 ( "first"및 "last")이 출력됩니다.
왜 내가 예상 한 결과를 얻지 못하는지 아는 사람이 있습니까?
고치다
그래서 요청 본문의 값은 전달되지 않습니다. 왜냐하면 저는 @RequestBody 주석을 내 인터페이스뿐만 아니라 실제 메소드 구현에 사용해야하기 때문입니다. 일단 그렇게하면 문제가 해결됩니다.
해결법
-
==============================
1.그래서 요청 본문의 값은 전달되지 않습니다. 왜냐하면 저는 @RequestBody 주석을 내 인터페이스뿐만 아니라 실제 메소드 구현에 사용해야하기 때문입니다. 일단 그렇게하면 문제가 해결됩니다.
그래서 요청 본문의 값은 전달되지 않습니다. 왜냐하면 저는 @RequestBody 주석을 내 인터페이스뿐만 아니라 실제 메소드 구현에 사용해야하기 때문입니다. 일단 그렇게하면 문제가 해결됩니다.
-
==============================
2.당신은 여러 가지 방법으로 그것을 할 수 있습니다, 나는 아래에서 다른 방법으로 그것을 할 것입니다 -
당신은 여러 가지 방법으로 그것을 할 수 있습니다, 나는 아래에서 다른 방법으로 그것을 할 것입니다 -
참고 : 요청 데이터는 { "customerInfo": { "firstname": "xyz", "lastname": "XYZ"}}
첫번째 방법 우리는 아래와 같이지도 위에 데이터를 바인딩 할 수 있습니다.
@RequestMapping(value = "/send", headers = "Accept=application/json", method = RequestMethod.POST) public void sendEmails(@RequestBody HashMap<String, HashMap<String, String>> requestData) { HashMap<String, String> customerInfo = requestData.get("customerInfo"); String firstname = customerInfo.get("firstname"); String lastname = customerInfo.get("lastname"); //TODO now do whatever you want to do. }
우리가 pojo에 직접 바인딩 할 수있는 두 번째 방법
1 단계에서 dto 클래스 UserInfo.java를 만듭니다.
public class UserInfo { private CustomerInfo customerInfo1; public CustomerInfo getCustomerInfo1() { return customerInfo1; } public void setCustomerInfo1(CustomerInfo customerInfo1) { this.customerInfo1 = customerInfo1; } }
단계 1. 다른 dto classCustomerInfo.java를 작성하십시오.
class CustomerInfo { private String firstname; private String lastname; public String getFirstname() { return firstname; } public void setFirstname(String firstname) { this.firstname = firstname; } public String getLastname() { return lastname; } public void setLastname(String lastname) { this.lastname = lastname; } }
3 단계 요청 본문 데이터를 pojo에 바인딩
@RequestMapping(value = "/send", headers = "Accept=application/json", method = RequestMethod.POST) public void sendEmails(@RequestBody UserInfo userInfo) { //TODO now do whatever want to do with dto object }
나는 그것이 당신을 도와 줄 수 있기를 바랍니다. 감사
-
==============================
3.이것에 대한 포맷은 끔찍하지만 잭슨 구성에서는 작동합니다.
이것에 대한 포맷은 끔찍하지만 잭슨 구성에서는 작동합니다.
<!-- Use Jackson for JSON conversion (POJO to JSON outbound). --> <bean id="jsonMessageConverter" class="org.springframework.http.converter.json.MappingJackson2HttpMessageConverter"/> <!-- Use JSON conversion for messages --> <bean class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter"> <property name="messageConverters"> <list> <ref bean="jsonMessageConverter"/> </list> </property> </bean>
또한 주석에서 언급했듯이 JSON이 객체에 잘못되었습니다.
{"firstname":"xyz","lastname":"XYZ"}
귀하의 개체에 대한 올바른 JSON 것으로 나타납니다.
-
==============================
4.샘플 데이터 :
샘플 데이터 :
[ { "targetObj":{ "userId":1, "userName":"Devendra" } }, { "targetObj":{ "userId":2, "userName":"Ibrahim" } }, { "targetObj":{ "userId":3, "userName":"Suraj" } } ]
위의 데이터에 대해서는 저를 위해 작동하는이 pring 컨트롤러 방법 :
@RequestMapping(value="/saveWorkflowUser", method = RequestMethod.POST) public void saveWorkflowUser (@RequestBody List<HashMap<String ,HashMap<String , String>>> userList ) { System.out.println(" in saveWorkflowUser : "+userList); //TODO now do whatever you want to do. }
-
==============================
5.기본 생성자에서 두 문을 제거하고
기본 생성자에서 두 문을 제거하고
from https://stackoverflow.com/questions/38960117/spring-json-request-body-not-mapped-to-java-pojo by cc-by-sa and MIT license
'SPRING' 카테고리의 다른 글
[SPRING] 동일한 인터페이스의 여러 모의 주입 방법 (0) | 2019.03.25 |
---|---|
[SPRING] spring jpa application.properties useSSL (0) | 2019.03.25 |
[SPRING] RestTemplate은 URL을 이스케이프 처리하지 않습니다. (0) | 2019.03.24 |
[SPRING] 스프링 컨테이너가 빈의 싱글 톤 인스턴스를 반환하지 않게하려면 어떻게해야합니까? (0) | 2019.03.24 |
[SPRING] JUnitTest의 @ControllerAdvice 주석이 달린 컨트롤러를 MockMVC에 등록하십시오. (0) | 2019.03.24 |