当前位置: 首页 > 知识库问答 >
问题:

@jsonProperty不为Content-Type工作:应用程序/x-www-form-urlencoded

傅兴平
2023-03-14

RESTAPI在映射到Java对象时采用输入内容类型:application/x-www-form-urlencoded,如

 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为null。

我正在使用Jackson annotations 2.3 jar

有什么建议吗?可能有什么问题?

共有2个答案

甘学潞
2023-03-14

我认为一个非常简单的解决方案,就是有一个与变量相关的setter,并带有“\u1”。

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);
    }
    ......
}

还有更多的解决方案。请参阅链接。

宰父保臣
2023-03-14

我有同样的问题最近使用SpringMVC和杰克逊!

在Spring中,当您显式地将endpoint配置为仅使用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不是常规映射。每个元素值都是一个链接列表,因为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);

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

 类似资料:
  • 问题内容: REST API映射到Java对象时,采用输入内容类型: 在表单输入请求中,我正在设置my_name和my_phone的值,但是MyRequest对象带有myName和myPhone作为空值。 我正在使用Jackson批注2.3 jar 有什么建议可能有什么问题吗? 问题答案: 我最近在使用SpringMVC和Jackson时遇到了同样的问题! 在Spring中,当您将端点显式配置为仅

  • 问题内容: 我想上网本REST API,它接受三个参数: ,, 我做它像这样在AngularJS为: 但是我总是这样: 对象{数据:“ {”结果“:”假“}”“,状态:200,配置:对象,状态文本:”确定“,标头:功能} 要么 {“ data”:“ {\” result \“:\” false \“}”,“状态”:200,“ config”:{“方法”:“ POST”,“ transformReq

  • 当内容类型不是text/html、text/plain或text/xml,而是application/x-www-form-urlencoded内容类型时,我很难理解如何设置字符集。 给出以下(简化的)javascript代码: 如果我没有显式设置编码, Firebug告诉我内容类型是"Application/x-www-form-urlencoded; charset=UTF-8"。 例如,如果

  • 问题内容: 我曾经有ElasticSearch 5.2,并且刚升级到6.0。 我正在尝试按照此处的指南创建索引模板,但出现错误 我的查询是 问题答案: 要解决此问题,请添加curl选项 这个错误是由于 严格的内容类型检查 在ElasticSearch 6.0中引入,在解释这个岗位 从Elasticsearch 6.0开始,所有包含主体的REST请求也必须提供该主体的正确内容类型。

  • 问题内容: 我已经将Elasticsearch(5.5版)集成到Gitlab中并尝试使用它。这是我从外部Windows客户端发送的命令: 但这不起作用。在客户端上,我得到以下错误: {“错误”:“不支持Content-Type标头[应用程序/ x-www-form-urlencoded]”,“状态”:406} curl:(6)无法解析主机:text curl:(3)[globbing ]第1列 c

  • 感谢您就我在CXF REST提供商方面面临的以下问题提供建议。 我使用Apache CXF开发了REST web服务服务器。以下是合同定义。请注意,这是在Camel上下文中使用的。 以下是我的bean定义: 当我发送内容类型为“application/json”的请求时,一切正常。但当发送内容类型为“application/x-www-form-urlencoded”的请求时,请求会命中服务器,但