23

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

@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 可以实现这样的事情吗?我是否有任何机会使用错误的注释?

4

2 回答 2

29

只有在实现类上不使用任何 jax-rs注释时,才能使用注释继承:它在 JSR-339 的 3.6 节中有说明。

您为方法重新定义 @Pathand @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 规范保持一致,建议始终重复注解,而不是依赖注解继承。

于 2013-06-06T07:50:23.770 回答
2

我在使用 OpenAPI 生成器自动生成的接口时遇到了类似的问题。这里的问题是我不能轻易地@Path从界面中删除注释,另外将其添加到类中会导致歧义问题。

然而,-annotated 接口的问题@Path只发生在注册包上自动发现的资源上。对于已注册的包,所有带注释的类(不幸的是接口也是如此)都@Path将被实例化。

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

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

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

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

于 2020-06-22T10:57:24.093 回答