REST @Context UriInfo为空

时间:2015-11-30 07:47:58

标签: json ajax rest jersey

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

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始终为空

这可能是什么原因?

1 个答案:

答案 0 :(得分:1)

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

话虽如此,您不希望来自URI的任何信息。你想要的是请求正文内容。使用application/json,通常我们可以使用POJO对传入数据建模(如described here)。您需要确保有一个JSON提供程序来处理JSON到POJO反序列化。有关这方面的帮助,我需要知道您使用的是什么泽西版(如果您需要帮助,可以在下面发表评论)。

只是为了看到数据进入(没有POJO转换),你可以只有一个String参数,反序列化会将JSON作为String传递给方法

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

至于发送数据,我会避免使用.serializArray()表单。你将会留下像

这样的JSON
[
  {
    "name": "...",
    "value": "..."
  },
  {
    "name": "...",
    "value": "..."
  }
]

使用它并不是很漂亮,因为你需要类似Pair类的东西,它实际上没有语义价值。最好只创建一个将Javascript模型对象映射到Java对象的POJO。这也在第一个链接中描述。

更新

对于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>