1

我正在用球衣构建 REST 服务,但遇到了一个奇怪的异常。我想打一个 REST uri,类似于:

http://localhost:9889/rest/Users/{userid}

与请求一起发送的内容采用 JSON 格式,类似于:

{
"attr1":"name",
"attr2":"age"
}

端点 url 代码如下所示:

@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 的地方工作

4

3 回答 3

2

您的 getUserInfoQuery() 方法是否使用 @GET 注释进行了注释?如果是,则映射到 HTTP GET 请求。您不能在 HTTP GET 中发送实体,因此未注释的参数没有意义(因为 Jersey 将实体映射到未注释的参数,但如前所述,在 GET 的情况下没有实体)。

于 2012-09-06T11:52:06.703 回答
1

将您的方法更改getUserInfoQuery()@PUT.
QueryDoc类中删除除@XmlRootElement. QueryDoc @XmlElement由于您在请求正文中传递的属性名称与不需要的属性名称相同。而且@XmlElement应该给ge getter方法。

这是一篇关于 ReST with Jersey的好文章。

于 2012-09-09T17:33:40.857 回答
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) {
    ...
}
于 2017-01-08T15:12:06.090 回答