【发布时间】: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