首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >@JsonProperty不适用于Content-Type : application/x-www-form-urlencoded

@JsonProperty不适用于Content-Type : application/x-www-form-urlencoded
EN

Stack Overflow用户
提问于 2016-08-04 11:18:31
回答 2查看 4.8K关注 0票数 4

REST API接受输入内容类型: application/x-www-form-urlencoded,当它被映射到Java对象时,例如

代码语言:javascript
复制
 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

有什么建议可能是错的吗?

EN

回答 2

Stack Overflow用户

发布于 2016-09-11 06:03:40

我最近在使用SpringMVC和Jackson时遇到了同样的问题!

在Spring中,当您显式地将您的端点配置为只使用application/x-www-form-urlencoded请求时,Spring能够序列化到您的POJO类中,但它不使用Jackson,因为它不是JSON。

因此,为了让Jackson注释能够使用您的POJO,您必须:

  1. 以地图形式获取数据
  2. 使用杰克逊的ObjectMapper

解析数据地图

在我的例子中,使用Spring我可以用以下代码解决这个问题:

代码语言:javascript
复制
@RequestMapping(
        value = "/rest/sth",
        method = RequestMethod.POST
)
public ResponseEntity<String> create(@RequestBody MultiValueMap paramMap) { ... }

当您从@RequestMapping注释中删除"consumes“属性时,您必须使用@RequestBody,否则Spring将无法将您的地图标识为有效参数。

您可能会注意到的一件事是,MultiValueMap不是常规的映射。每个元素值都是一个LinkedList,因为http表单数据可以重复这些值,因此这些值将被添加到该链表中。

考虑到这一点,下面是获取第一个元素并创建另一个映射以转换为POJO的简单代码:

代码语言:javascript
复制
    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);

我希望它能帮助你它是如何帮助我的:)

票数 4
EN

Stack Overflow用户

发布于 2017-10-19 21:01:40

我认为最简单的解决方案就是让setter与变量"_“相关。

代码语言:javascript
复制
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

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/38757946

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档