【问题标题】:@JsonProperty not working for Content-Type : application/x-www-form-urlencoded@JsonProperty 不适用于 Content-Type :application/x-www-form-urlencoded
【发布时间】:2016-08-04 03:18:31
【问题描述】:

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.3 jar

有什么建议吗?

【问题讨论】:

    标签: java rest jackson spring-restcontroller


    【解决方案1】:

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

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

    因此,为了让这些 Jackson 注释使用您的 POJO 工作,您必须:

    1. 以地图形式获取数据
    2. 使用 Jackson 的 ObjectMapper 解析您的数据映射

    就我而言,使用 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);
    

    我希望它能帮助你:)

    【讨论】:

      【解决方案2】:

      我认为非常简单的解决方案是使用“_”与变量相关的设置器。

      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

      【讨论】:

        猜你喜欢
        • 2019-02-04
        • 2013-11-10
        • 2019-05-24
        • 2018-12-27
        • 2018-05-12
        • 2018-06-20
        • 2019-10-26
        • 2017-09-22
        • 2017-07-19
        相关资源
        最近更新 更多