REST实现与泽西的例外

时间:2012-09-06 10:58:57

标签: json rest exception jersey

我正在使用泽西建立一个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的地方工作

3 个答案:

答案 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) {
    ...
}