Spring JSON请求主体未映射到Java POJO

Spring JSON请求主体未映射到Java POJO,java,json,spring,spring-mvc,jackson,Java,Json,Spring,Spring Mvc,Jackson,我正在使用Spring实现一个RESTful web服务。其中一个端点接收JSON字符串作为请求体,我希望将其映射到POJO。然而,现在看来传入的JSON字符串并没有映射到POJO的属性 这是@RestController接口 @RequestMapping(value="/send", headers="Accept=application/json", method=RequestMethod.POST) public void sendEmails(@RequestBody Custome

我正在使用Spring实现一个RESTful web服务。其中一个端点接收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;
    }
}
最后是我的发帖请求:

{"CustomerInfo":{"firstname":"xyz","lastname":"XYZ"}}
将内容类型指定为application/json

但是,当我打印出对象值时,打印出的是默认值(“first”和“last”),而不是我传入的值(“xyz”和“xyz”)

有人知道为什么我没有得到我期望的结果吗

修复


结果是,没有传入请求体的值,因为我不仅需要在接口中,而且需要在实际的方法实现中使用@RequestBody注释。一旦我有了它,问题就解决了。

这上面的格式很糟糕,但这应该适用于jackson配置

<!-- 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"}
注意:
请求数据应该是{“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.
}
步骤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;
        }
    }
步骤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
    }

我希望它能帮助你。感谢从默认构造函数中删除这两条语句,然后尝试

,结果是,请求主体的值没有传入,因为我不仅需要在接口中,而且需要在实际的方法实现中使用@RequestBody注释。一旦有了这些,问题就解决了。

示例数据:

[  
{  
  "targetObj":{  
     "userId":1,
     "userName":"Devendra"
  }
},
{  
  "targetObj":{  
     "userId":2,
     "userName":"Ibrahim"
  }
},
{  
  "targetObj":{  
     "userId":3,
     "userName":"Suraj"
  }
}
]
对于以上数据,此弹簧控制器方法适用于我:

@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.
}
@RequestMapping(value=“/saveWorkflowUser”,method=RequestMethod.POST)
public void saveWorkflowUser(@RequestBody List userList){
System.out.println(“in-saveWorkflowUser:+userList”);
//现在做你想做的事。
}

如果你将json展平,会怎么样:
{“firstname”:“xyz”,“lastname”:“xyz”}
Hi@mszymborski,我已经试过了,但也没用。使用了默认构造函数。请尝试在
@RequestMapping
中使用
consumes
属性,而不是使用
标题。问题不在于Jackson,那么-raw ObjectMapper在展平版本中工作得很好。Hi@11thdimension,也尝试过了。没有帮助。非常感谢您提供了非常详细的答案。您建议的所有方法都可以实现转换。虽然它们不是我问题的解决方案,但我仍然很高兴了解所有这些。有没有办法将其简单地绑定到方法参数名,而不是引入新的java类或将其任意映射到键值对的映射?
@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.
}