我有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"
答案 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