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

die*_*rre 16 java jax-rs jersey java-ee-6

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

@Produces(MediaType.APPLICATION_JSON)
@Path("/user")
public interface UserService {

    @GET
    @Path("/{userId}")
    public Response getUser(@PathParam("userId") Long userId);

}
Run Code Online (Sandbox Code Playgroud)

为什么当我尝试实现一个版本Eclipse重写覆盖方法的注释而不是类?

class UserServiceImpl implements UserService {

    @Override
    @GET
    @Path("/{userId}")
    public Response getUser(@PathParam("userId") Long userId) {
        // TODO Auto-generated method stub
        return null;
    }

}
Run Code Online (Sandbox Code Playgroud)

我试图为restful Web服务创建一个标准定义,然后进行不同的实现.使用标准的jax-rs是否可以这样?我是否有机会使用错误的注释?

Car*_*ini 24

只有在实现类上不使用任何 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;
    }

}
Run Code Online (Sandbox Code Playgroud)

顺便说一下,规范鼓励我们复制具体类的注释:

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

  • 我的意思是你可以把它留在界面而不是混凝土上.这样,您可以使接口可用于客户端代理. (3认同)
  • 这个答案中提到的引用可以在这个文档(pdf)的3.6注释继承中找到:http://download.oracle.com/otn-pub/jcp/jaxrs-2_0-edr2-spec/jaxrs-2_0-edr2-规格.pdf (2认同)