Spring Тело запроса JSON, не привязанное к Java POJO

Я использую Spring для реализации веб-службы RESTful. Одна из конечных точек принимает строку 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"}}

с типом содержимого, указанным как application/json

Однако, когда я распечатываю значение объекта, значение по умолчанию ( "первый" и "последний" ) распечатывается вместо значения, которое я передал ( "xyz" и "XYZ" )

Кто-нибудь знает, почему я не получаю ожидаемый результат?

FIX

Итак, оказалось, что значение тела запроса не передано, потому что мне нужно иметь аннотацию @RequestBody не только в моем интерфейсе, но и в реализации фактического метода. Как только у меня это будет, проблема будет решена.

Ответ 1

Итак, оказалось, что значение тела запроса не передано, потому что мне нужно иметь аннотацию @RequestBody не только в моем интерфейсе, но и в реализации фактического метода. Как только у меня это будет, проблема будет решена.

Ответ 2

Вы можете сделать это разными способами. Здесь я буду делать это разными способами -

NOTE: запросить данные shuld be { "customerInfo": { "firstname": "xyz", "lastname": "XYZ" }}

1st way Мы можем привязать выше данные к карте, как показано ниже

@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.
}

2nd way мы можем связать его непосредственно с pojo

step 1 создать класс dto UserInfo.java

public class UserInfo {
    private CustomerInfo customerInfo1;

    public CustomerInfo getCustomerInfo1() {
        return customerInfo1;
    }

    public void setCustomerInfo1(CustomerInfo customerInfo1) {
        this.customerInfo1 = customerInfo1;
    }
}

step 1. создать еще один класс dto CustomerInfo.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;
        }
    }

step 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

удалите эти два оператора из конструктора по умолчанию и попробуйте

Ответ 5

Пример данных:

[  
{  
  "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.
}