REST @Context UriInfo 为空

REST @Context UriInfo is empty

我有以下代码片段,我必须使用它向服务器传递数据

function myFuntion() { 
    var myurl = 'myurl/';
    var mydata = $("#myform").serializeArray();
    $.ajax({
        url: myurl,
        type: 'POST',
        contentType : "application/json; charset=utf-8",
        dataType: 'json',
            data: mydata,

        success: function (data) {
            ...
        }
    });
}

并在服务器 JERSEY 代码中

@POST
@Path("/persistlogs")
public Object myMethod(@Context
    UriInfo uriInfo) {

MultivaluedMap params = uriInfo.getPathParameters();
params.size() // is always null 

问题是 uriInfo 始终为 null

这可能是什么原因?

UriInfo主要用来获取URI/URL的信息。 getPathParameters() return Map 键值对,其中键是从 @Path 中的 URI 模板中提取的字符串。例如 @Path("{id}") 会将 id 作为键,将其值作为键值。

也就是说,您不需要 URI 中的任何信息。你想要的是请求正文内容。使用 application/json,一般我们可以使用 POJO 来对传入的数据进行建模(如 )。您将需要确保您有一个 JSON 提供程序来处理 JSON 到 POJO 的反序列化。如需这方面的帮助,我需要知道您使用的是什么 Jersey 版本(如果您需要帮助,可以在下面发表评论)。

只是为了查看传入的数据(没有 POJO 转换),您可以只使用 String 参数,反序列化会将 JSON 作为字符串传递给方法

@POST
@Path("/persistlogs")
@Consumes("application/json")
public Object myMethod(String jsonData) {
    System.out.println(jsonData);
}

至于发送数据,我会避免使用 .serializArray() 作为表单。你将剩下 JSON 喜欢

[
  {
    "name": "...",
    "value": "..."
  },
  {
    "name": "...",
    "value": "..."
  }
]

它不是很好用,因为你需要像 Pair class 这样的东西,它实际上没有语义价值。最好只创建一个将 Java 脚本模型对象映射到 Java 对象的 POJO。这在第一个link.

中也有描述

更新

对于 Jersey (1.x) JSON 支持,添加以下 Maven dependency

<dependency>
    <groupId>com.sun.jersey</groupId>
    <artifactId>jersey-json</artifactId>
    <version>1.17.1</version>
</dependency>

然后在你的 web.xml 中配置 JSON 支持。

<init-param>
    <param-name>com.sun.jersey.api.json.POJOMappingFeature</param-name>
    <param-value>true</param-value>
</init-param>