Ответ 1
Итак, оказалось, что значение тела запроса не передано, потому что мне нужно иметь аннотацию @RequestBody не только в моем интерфейсе, но и в реализации фактического метода. Как только у меня это будет, проблема будет решена.
Я использую 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 не только в моем интерфейсе, но и в реализации фактического метода. Как только у меня это будет, проблема будет решена.
Итак, оказалось, что значение тела запроса не передано, потому что мне нужно иметь аннотацию @RequestBody не только в моем интерфейсе, но и в реализации фактического метода. Как только у меня это будет, проблема будет решена.
Вы можете сделать это разными способами. Здесь я буду делать это разными способами -
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
}
Я надеюсь, что это поможет вам. Благодаря
Форматирование на этом ужасно, но это должно работать для конфигурации джексона.
<!-- 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 для вашего объекта.
удалите эти два оператора из конструктора по умолчанию и попробуйте
Пример данных:
[
{
"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.
}