是否有可能定义一个与其实现分离的 jax-rs 服务接口(使用 eclipse 和 jersey)?

2022-09-01 23:17:42

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

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

}

我试图为宁静的Web服务创建一个标准定义,然后有不同的实现。使用标准 jax-rs 可以实现这样的事情吗?我是否偶然使用了错误的注释?


答案 1

仅当未在实现类上使用任何注释时,才能使用注释继承:JSR-339 的第 3.6 节中对此进行了说明。jax-rs

您为方法重新定义 和,但不为类重新定义 和。@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;
    }

}

顺便说一句,该规范鼓励我们在具体类上复制注释:

为了与其他 Java EE 规范保持一致,建议始终重复注解,而不是依赖于注解继承。


答案 2

我在使用OpenAPI生成器自动生成的界面时遇到了类似的问题。这里的问题是我无法轻松地从界面中删除注释,并且将其添加到类中还会导致歧义问题。@Path

但是,带注释的接口的问题仅发生在已注册包上自动发现的资源上。对于已注册的包,将实例化所有带注释的类(不幸的是,还有接口)。@Path@Path

为防止出现这种情况,您只需手动向您的资源注册资源,如以下示例所示:ResourceConfig

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

只需确保您的接口不在注册到 .使用此方法,您可以使用示例中的实现,并且添加到接口的注释也将得到正确解释。ResourceConfig@Path

免责声明:首先,接口上可能不应该有任何路径注释,但不幸的是,这是OpenAPI生成器创建的。如果您发现自己处于类似的情况,我希望这有帮助。否则,您应该参考接受的答案。@Path


推荐