【问题标题】:Using javax.ws.rs.HeaderParam for passing JSON parameter使用 javax.ws.rs.HeaderParam 传递 JSON 参数
【发布时间】:2015-03-06 15:02:10
【问题描述】:

我正在使用 jax rs 开发一个 REST Web 服务。在当前方法中,我想要一个 @GET 请求,其中用户使用 http 请求的标头传递一个名为“request”的 json 参数。

代码:

    @GET
    @Path("load")
    @Produces(MediaType.APPLICATION_JSON)
    public LoadUserResponse load(@HeaderParam("request") LoadUserRequest sRequest) throws Exception{


        User user= userBean.load(sRequest.getId());

        LoadUserResponse response = new LoadUserResponse();
        response.Transform(user);

        return response;
    }

这段代码给了我一个例外:

java.lang.RuntimeException: Unable to find a constructor that takes a String param or a valueOf() or fromString() method for javax.ws.rs.HeaderParam(\"request\") on public com.totempool.rest.responses.LoadUserResponse com.totempool.rest.services.UserService.load(com.totempool.rest.requests.LoadUserRequest) throws java.lang.Exception for basetype: com.totempool.rest.requests.LoadUserRequest"}}

POJO 类:

package com.totempool.rest.requests;

import javax.xml.bind.annotation.XmlElement;
import javax.xml.bind.annotation.XmlRootElement;


@XmlRootElement
public class LoadUserRequest {

    @XmlElement(name="id")
    private long id;

    public LoadUserRequest(){

    }

    public long getId() {
        return id;
    }

    public LoadUserRequest fromString(String param){
        return null;

    }

}

我的问题是,有没有办法传递 @HeaderParam 并将其自动解析到对象?

通过自动解析我的意思是这样的:

    @POST
    @Path("list")
    @Consumes(MediaType.APPLICATION_JSON)
    @Produces(MediaType.APPLICATION_JSON)
    public ListUserResponse list(ListUserRequest request) throws Exception{

        List<User> users= userBean.list();
        ListUserResponse response = new ListUserResponse();
        response.Transform(users);

        return response;

    }

使用此代码,应用程序将识别 json 发送并将其解析为对象。

一个可能的选项,但不适合我的需要:

    @GET
    @Path("load")
    @Produces(MediaType.APPLICATION_JSON)
    public LoadUserResponse load(@HeaderParam("request") String sRequest) throws Exception{

        ObjectMapper map= new ObjectMapper();
        LoadUserRequest request=map.readValue(sRequest, LoadUserRequest.class);
        User user= userBean.load(request.getId());

        LoadUserResponse response = new LoadUserResponse();
        response.Transform(user);

        return response;
    }

我在这里获取字符串发送然后手动解析它,问题是网络服务可能有几个类似的方法,我不想在每一个中手动执行此操作。

【问题讨论】:

  • 该异常准确地解释了需要什么。 LoaderUserRequest 应该有一个带有 String arg 或静态 valueOf(String) 或静态 fromString(String) 的构造函数,后两者返回 LoaderUserRequest 的实例。无论哪种方式,您仍然需要使用对象映射器来实际创建带有传入字符串的对象。这就是@HeaderParam 以及其他@XxxParam 注释的工作方式。可用的值类型是String,所以你需要对它做一些事情
  • 顺便说一句,我们为什么要在标头中使用 JSON。似乎可以作为查询参数过去的东西(无论如何你只使用 id )。或者甚至是路径参数。

标签: java json web-services get jax-rs


【解决方案1】:

就我而言,它适用于以下解决方案(来自 Google 的 GSON)。我不知道这是否是最好的,但它可以工作:-) 我把这段代码放在每个 REST-Transfer-Class 中。

/**
 * Parse JSON to Object.
 * 
 * @param p_json JSON String
 * @return Object
 */
public static POJO_XY valueOf(String p_json) {
    return gson.fromJson(p_json, POJO_XY.class);
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-11-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多