REST API接受输入内容类型: application/x-www-form-urlencoded,当它被映射到Java对象时,例如
public class MyRequest {
@JsonProperty("my_name")
private String myName;
@JsonProperty("my_phone")
private String myPhone;
//Getters and Setters of myName and myPhone.
}在表单输入请求中,我设置了my_name和my_phone的值,但MyRequest对象将myName和myPhone设置为空。
我正在使用Jackson-annotations 2.3JAR
有什么建议可能是错的吗?
发布于 2016-09-11 06:03:40
我最近在使用SpringMVC和Jackson时遇到了同样的问题!
在Spring中,当您显式地将您的端点配置为只使用application/x-www-form-urlencoded请求时,Spring能够序列化到您的POJO类中,但它不使用Jackson,因为它不是JSON。
因此,为了让Jackson注释能够使用您的POJO,您必须:
解析数据地图
在我的例子中,使用Spring我可以用以下代码解决这个问题:
@RequestMapping(
value = "/rest/sth",
method = RequestMethod.POST
)
public ResponseEntity<String> create(@RequestBody MultiValueMap paramMap) { ... }当您从@RequestMapping注释中删除"consumes“属性时,您必须使用@RequestBody,否则Spring将无法将您的地图标识为有效参数。
您可能会注意到的一件事是,MultiValueMap不是常规的映射。每个元素值都是一个LinkedList,因为http表单数据可以重复这些值,因此这些值将被添加到该链表中。
考虑到这一点,下面是获取第一个元素并创建另一个映射以转换为POJO的简单代码:
HashMap<String, Object> newMap = new HashMap<>();
Arrays.asList(new String[]{"my_name", "my_phone"})
.forEach( k -> newMap.put(k, ((List<?>) paramMap.get(k)).get(0)));
MyRequest myrequest = new ObjectMapper().convertValue(newMap, MyRequest.class);我希望它能帮助你它是如何帮助我的:)
发布于 2017-10-19 21:01:40
我认为最简单的解决方案就是让setter与变量"_“相关。
public class MyRequest {
@JsonProperty("my_name")
private String myName;
@JsonProperty("my_phone")
private String myPhone;
//Getters and Setters of myName and myPhone.
//Setters for application/x-www-form-urlencoded
public void setMy_name(String name) {
setMyName(name);
}
......
}还有更多的解决方案。请参阅link。
https://stackoverflow.com/questions/38757946
复制相似问题