web-dev-qa-db-ja.com

(Eclipseとジャージを使用して)実装から分離されたjax-rsサービスインターフェースを定義することは可能ですか?

タイトルがわかりにくいかどうかはわかりませんが、次のインターフェイスがあるとしましょう。

@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で可能ですか?万が一、間違った注釈を使用していませんか?

18
dierre

アノテーションの継承は、実装クラスでanyjax-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;
    }

}

ところで、仕様では、具象クラスに注釈を複製することを推奨しています。

他のJava EE仕様との一貫性を保つために、アノテーションの継承に依存するのではなく、常にアノテーションを繰り返すことをお勧めします。

24