Jersey @Path注释在类级别上是必须的

11

我有一个类似这样的类:

public class TestService {

@Path("/v1/test1/list")
    public Response getTest1() {
}

@Path("/v1/test2/list")
    public Response getTest2() {
}

}
如果我在类级别上不使用@Path注释,那么这个类将不被识别为REST资源,但是我不能给该类"/v1"路径,因为已经有另一个带有@Path("/v1")的类了。
有可能的解决方法是什么,以使得这个类能够被识别为Rest资源?
3个回答

14

资源类

需要使用@Path注解来定义一个资源类。引用Jersey文档的说法:

根资源类是带有@Path注解的POJO(普通Java对象),至少有一个带有@Path注解或者带有资源方法指定符注解如@GET@PUT@POST@DELETE的方法。

一个可能的解决方案

正如已经被Justas提到的一样,一个可能的解决方案是在TestService类上添加@Path("")注解。然而,这不太好看:

@Path("")
public class TestService {

    @GET
    @Path("/v1/test1/list")
    public Response getTest1() {
        ...
    }

    @GET
    @Path("/v1/test2/list")
    public Response getTest2() {
        ...
    }
}

更好的解决方案

我不知道你的项目是什么样子的,但是与其只有一个类,我会设计两个类,如下所示:

@Path("/v1/test1")
public class TestService1 {

    @GET
    @Path("/list")
    public Response getTest1() {
        ...
    }
}
@Path("/v1/test2")
public class TestService2 {

    @GET
    @Path("/list")
    public Response getTest2() {
        ...
    }
}

3
您可以添加空路径@Path("")@Path("/")。但是,这个问题可能表明您应该以不同的方式设计代码。

我在查阅的任何文档中都没有找到@Path需要在类级别上的提及。您知道这是否是Jersey特定的要求吗? - Dimitrios K.

1

@Path注解用于指定可以访问资源和API的URI。在这种情况下,资源是REST Web服务本身。因此,该注解存在于类级别和方法级别。必须使用@Path注解对REST Web资源类进行注释。因此,如果用户想要通过资源'HelloWorld'上下文访问“Countries”,则:

类级别的资源应具有@Path("/")。这是类级别的默认注解。 API级别的资源应具有@Path("Countries")注解。 作为最佳实践,类级别路径注解应该是限定Web服务的名词,而方法级别注解可以是名词或动作(例如,用户和添加用户)。

https://www.juniper.net/documentation/en_US/junos-space-sdk/13.1/apiref/com.juniper.junos_space.sdk.help/html/reference/spaceannoREST.html


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接