Можно ли определить интерфейс службы 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;
    }

}

Я пытался создать стандартное определение для спокойного веб-сервиса, а затем имел разные реализации. Что-то вроде этого возможно со стандартными jax-rs? Я использую неправильные аннотации случайно?

Ответ 1

Наследование аннотаций можно использовать только в том случае, если вы не используете аннотацию jax-rs для класса реализации: это указано в разделе 3.6 JSR-339.

Вы переопределяете @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 рекомендуется всегда повторять аннотации полагаться на наследование аннотации.