Java 是否可以定义一个与其实现分离的jax-rs服务接口(使用eclipse和jersey)?
我不知道标题是否令人困惑,但假设我有以下界面:Java 是否可以定义一个与其实现分离的jax-rs服务接口(使用eclipse和jersey)?,java,jersey,jax-rs,java-ee-6,Java,Jersey,Jax Rs,Java Ee 6,我不知道标题是否令人困惑,但假设我有以下界面: @Produces(MediaType.APPLICATION_JSON) @Path("/user") public interface UserService { @GET @Path("/{userId}") public Response getUser(@PathParam("userId") Long userId); } 为什么当我尝试为重写的方法而不是类实现Eclipse重写注释的版本时 class U
@Produces(MediaType.APPLICATION_JSON)
@Path("/user")
public interface UserService {
@GET
@Path("/{userId}")
public Response getUser(@PathParam("userId") Long userId);
}
为什么当我尝试为重写的方法而不是类实现Eclipse重写注释的版本时
class UserServiceImpl implements UserService {
@Override
@GET
@Path("/{userId}")
public Response getUser(@PathParam("userId") Long userId) {
// TODO Auto-generated method stub
return null;
}
}
我试图为restful web服务创建一个标准定义,然后使用不同的实现。在标准jax-rs中可以实现类似的功能吗?我是否碰巧使用了错误的注释?只有在实现类上没有使用任何
jax-rs
注释时,才能使用注释继承:这在JSR-339的第3.6节中有说明
您可以为方法而不是类重新定义@Path
和@products
因此,代码中的路径
注释应该位于具体类上:
public interface UserService {
@GET
@Path("/{userId}")
@Produces(MediaType.APPLICATION_JSON)
public Response getUser(@PathParam("userId") Long userId);
}
@Path("/user")
class UserServiceImpl implements UserService {
@Override
@GET
@Path("/{userId}")
@Produces(MediaType.APPLICATION_JSON)
public Response getUser(@PathParam("userId") Long userId) {
// TODO Auto-generated method stub
return null;
}
}
顺便说一句,规范鼓励我们在具体类上复制注释:
为了与其他JavaEE规范保持一致,建议始终重复注释
依赖注释继承的方法
我在使用OpenAPI生成器自动生成的接口时遇到了类似的问题。这里的问题是,我无法轻松地从接口中删除
@Path
注释,并且将其添加到类中会导致歧义问题
然而,@Path
-注释接口的问题只会出现在注册包上自动发现的资源上。对于已注册的包,将实例化使用@Path
注释的所有类(以及接口)
为了防止出现这种情况,您可以使用ResourceConfig
手动注册资源,如下例所示:
new ResourceConfig()
.registerClasses(UserServiceImpl.class);
只需确保您的接口不在使用ResourceConfig
注册的包中。使用这种方法,您可以使用示例中的实现,并且添加到接口的@Path
注释也将得到正确解释
免责声明:首先,接口上可能不应该有任何
@Path
路径注释,但不幸的是,这是OpenAPI生成器创建的。如果你发现自己处于类似的情况,我希望这会有所帮助。否则,您应该参考公认的答案。实际上,您不需要在界面和混凝土上都添加注释。除了类(@Path(“/user”))上的@Path之外,您可以将所有内容都放在接口上。我的意思是,您可以将它放在接口上,而不是具体的。通过这种方式,您可以使该接口可用于客户端代理。@shlomi33您是对的,但不鼓励这样做。也许在最后一次编辑之后,我会说得更好。我发现如果我在接口方法上添加POST和PathParam,而不是在实现类方法上,我会得到404。(使用jersey,grizzly)。此答案中提到的引用可在本文档的3.6注释继承中找到(pdf):