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

}

私は、安らかな Web サービスの標準定義を作成しようとしていて、さまざまな実装を行っていました。標準のjax-rsでこのようなことは可能ですか? 間違った注釈を使用していませんか?

4

2 に答える 2

29

実装クラスで注釈を使用しない 場合にのみ、注釈の継承を使用できますjax-rs。これは、JSR-339 のセクション 3.6 に記載されています。

@Pathメソッドに対してandを再定義します @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 に答える