복붙노트

[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. ==============================

    1.그래서 요청 본문의 값은 전달되지 않습니다. 왜냐하면 저는 @RequestBody 주석을 내 인터페이스뿐만 아니라 실제 메소드 구현에 사용해야하기 때문입니다. 일단 그렇게하면 문제가 해결됩니다.

    그래서 요청 본문의 값은 전달되지 않습니다. 왜냐하면 저는 @RequestBody 주석을 내 인터페이스뿐만 아니라 실제 메소드 구현에 사용해야하기 때문입니다. 일단 그렇게하면 문제가 해결됩니다.

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

    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. ==============================

    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. ==============================

    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. ==============================

    5.기본 생성자에서 두 문을 제거하고

    기본 생성자에서 두 문을 제거하고

  6. from https://stackoverflow.com/questions/38960117/spring-json-request-body-not-mapped-to-java-pojo by cc-by-sa and MIT license