杰克逊:简单的映射

时间:2016-12-08 16:47:09

标签: java json spring jackson

我有pojo:

public class Address {
    private String country;
    private String city;
    private String street;
    private String building;
    private String room;

和控制器的方法:

@RequestMapping(value = "/test_get_corporate_footprint", method = RequestMethod.GET)
public void getCorporateFootprint(@RequestParam("officeLocation") String officeLocation) {
    System.out.println(officeLocation); //{"country":"Belarus","city":"Minsk","street":"Bahdanovicha","building":"1/3v","room":"3"}
}

但是当我将控制器方法更改为接受Address作为参数时,它返回null:

@RequestMapping(value = "/test_get_corporate_footprint", method = RequestMethod.GET)
public void getCorporateFootprint(@RequestParam("officeLocation") Address officeLocation) {
    System.out.println(officeLocation);//null
}

有什么问题?

"Failed to convert value of type 'java.lang.String' to required type 'com.model.Address'; nested exception is java.lang.IllegalStateException: Cannot convert value of type 'java.lang.String' to required type 'com.model.Address': no matching editors or conversion strategy found"

2 个答案:

答案 0 :(得分:1)

您必须将方法更改为RequestMethod.POST,并使用预期的json作为有效负载发出POST而不是GET。

您可能还需要配置spring以使用json序列化程序。

答案 1 :(得分:1)

您无法将复杂类型(作为地址对象)映射到requestParameters(即http:/ localhost?param1 = 1& param2 = 2),而无需添加用于处理它们的自定义逻辑。

Spring通过使用自定义参数解析器从请求参数预填充某个对象类型(例如HandlerMethodArgumentResolver)来实现这一点。

同样,当在服务器上发出HTTP GET请求时,您无法传递正文/内容,因此更灵活的解决方案是使用HTTP POST方法,并将您的对象表示为请求正文中的JSON。

要获取该功能的优点,您可以在方法参数上使用@RequestBody注释。

因此,为了使您的控制器方法能够接收地址对象,您应该添加以下更改:

@RequestMapping(value = "/test_get_corporate_footprint", method = RequestMethod.POST)
public void getCorporateFootprint(@RequestBody Address officeLocation) {
    System.out.println(officeLocation);
}

另外一定要在类路径上安装杰克逊图书馆。

然后,您可以使用

发出帖子请求
curl -X POST -H "Content-Type:application/json" -d '{"country":"someCountry","city":"city"}' http://server/test_get_corporate_footprint