【问题标题】:REST @Context UriInfo is emptyREST @Context UriInfo 为空
【发布时间】:2015-11-30 07:47:58
【问题描述】:

我有以下代码 sn-p 我必须使用它来将数据传递给服务器

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

这可能是什么原因?

【问题讨论】:

    标签: json ajax rest jersey


    【解决方案1】:

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

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

    只看进来的数据(不用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>
    

    【讨论】:

    • 我使用的是 Jersey 1,1,7 版本。话虽如此,您能否提供 POJO 方法,以便我可以使用 @Context UriInfo,因为我发现当参数数量更多时它很方便。谢谢
    • 你错过了我回答的重点。 UriInfo 是从 URI 中获取数据。您的数据不在 URI 中。它在请求正文中,它应该在哪里。有关在 Java 和 Javascript 端制作 POJO 的帮助,请参阅我提供的链接。我将使用泽西提供者信息更新我的大部分信息。
    • 如果要使用application/x-www-form-urlencoded而不是application/json,则将@Consumes更改为application/x-www-form-urlencoded,对于方法参数,使用Form form。您可以通过asMap() 获取地图。在客户端,取出contentType,用serialze()代替serializeArray()
    猜你喜欢
    • 2016-04-13
    • 2017-07-27
    • 2017-08-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-12-07
    • 2020-09-16
    相关资源
    最近更新 更多