java—是否可以定义一个与实现分离的jax rs服务接口(使用eclipse和jersey)?

qq24tv8q  于 2021-06-30  发布在  Java
关注(0)|答案(2)|浏览(332)

我不知道标题是否令人困惑,但假设我有这样一个界面:

@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;
    }

}

我试图为restfulweb服务创建一个标准定义,然后使用不同的实现。在标准jax-rs中有这样的功能吗?我是不是用错注解了?

93ze6v8z

93ze6v8z1#

我在使用openapi生成器自动生成接口时遇到了类似的问题。这里的问题是我不能轻易地移除 @Path 来自接口的注解并将其添加到类中会导致歧义问题。
问题 @Path -但是,带注解的接口仅适用于在已注册包上自动发现的资源。对于已注册的包,所有用 @Path 将示例化。
为了防止这种情况发生,您只需手动向 ResourceConfig 如下例所示:

new ResourceConfig()
    .registerClasses(UserServiceImpl.class);

只需确保您的接口不在已向您的注册的包中 ResourceConfig . 使用这种方法,您可以使用示例中的实现以及 @Path 添加到接口的注解将被正确解释。
免责声明:可能不应该有任何 @Path 接口上的路径注解,但不幸的是,这是openapi生成器创建的。如果你发现自己处于类似的情况,我希望这能有所帮助。否则,你应该参考公认的答案。

ryhaxcpt

ryhaxcpt2#

只有在不使用注解继承的情况下,才能使用注解继承 jax-rs 实现类的注解:在jsr-339的第3.6节中有说明。
你重新定义 @Path 以及 @Produces 对于方法而不是类。
所以 Path 代码中的注解应位于具体类上:

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规范保持一致,建议始终重复注解,而不是依赖注解继承。

相关问题