Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sql-server-2005/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 是否可以定义一个与其实现分离的jax-rs服务接口(使用eclipse和jersey)?_Java_Jersey_Jax Rs_Java Ee 6 - Fatal编程技术网

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):