我正在使用泽西建立一个REST服务,但我遇到了一个奇怪的例外。 我想打一个类似于以下的REST uri:
http://localhost:9889/rest/Users/{userid}
与请求一起发送的内容是JSON,类似于:
{
"attr1":"name",
"attr2":"age"
}
端点网址代码如下:
@Path("/rest/Users")
class Users
{
@GET
@Produces(MediaType.TEXT_PLAIN)
@Path("/{userId}")
@Consumes(MediaType.APPLICATION_JSON)
public String getUserInfoQuery(
QueryDoc reqJSON,
@PathParam("userId") String userId,
@HeaderParam("Session-Token") String sessionId,
@HeaderParam("Authorization") String authToken)
)
{
.
.
.
.
}
}
QueryDoc资源如下所示:
@XmlRootElement
@XmlAccessorType(XmlAccessType.NONE)
public class QueryDoc
{
@XmlElement(name = "attr1")
private String attr1;
@XmlElement(name = "attr2")
private String attr2;
//getters and setters
.
.
.
.
}
当我启动服务器时,会抛出异常
com.sun.jersey.api.container.ContainerException: Fatal issues found at
class com.test.Users. See logs for more details.
at com.sun.jersey.server.impl.application.WebApplicationImpl.newResourceClass(WebApplicationIm....
我可以在http://www.skybert.net/java/jersey/找到此例外 并且如本链接所述......原因是
public String getUserInfoQuery(
QueryDoc reqJSON,
reqJSON没有被注释。如果我使用某个注释对其进行注释,则在启动服务器时不会引发异常,但在这种情况下,url响应毫无意义。如果我删除此参数,则url可以工作,但它不会使用请求JSON。 如何让它在我想要使用请求的JSON内容以及HeaderParams和PathParams的地方工作
答案 0 :(得分:2)
您的getUserInfoQuery()方法是否使用@GET注释进行了注释?如果是,则将其映射到HTTP GET请求。您无法在HTTP GET中发送实体,因此未注释的参数没有意义(因为Jersey将实体映射到未注释的参数,但如上所述,在GET的情况下没有实体)。
答案 1 :(得分:1)
将您的方法getUserInfoQuery()
更改为@PUT
。
在QueryDoc
班级中删除除@XmlRootElement
以外的所有注释。由于您在请求正文中传递的属性名称与QueryDoc
@XmlElement
中的属性名称相同,因此不需要。此外,@XmlElement
应该给予ge getter方法。
这是关于泽西岛ReST的good article。
答案 2 :(得分:0)
试试这个:
我有同样的例外,没有关于Jersey' newResourceClass'方法; 经过几个小时的调试,我意识到它是由于模糊的URI而发生的。
检查您的URI并消除任何可能的重复项,例如:
@Path("/users")
@GET
@Produces(MediaType.APPLICATION_JSON)
public List<String> getUsers() {
...
}
@Path("/users") // BAD
@GET
@Produces(MediaType.APPLICATION_JSON)
public String getUserById(@QueryParam("userId") String userId) {
...
}