Подтвердить что ты не робот

Наследование с помощью JAX-RS

Я использую JAX-RS для своих веб-сервисов. Я имею общую функциональность и хотел бы использовать наследование. Я предоставляю простые операции CRUD. Я определил такой интерфейс:

public interface ICRUD {

    @POST
    @Consumes("application/json")
    @Produces("application/json")
    @Path("create")
    public String createREST(String transferObject);

    @GET
    @Consumes("application/json")
    @Produces("application/json")
    @Path("retrieve/{id}")
    public String retrieveREST(@PathParam("id") String id);

    @POST
    @Consumes("application/json")
    @Produces("application/json")
    @Path("update")
    public void updateREST(@Suspended final AsyncResponse asyncResponse,
                           final String transferObject) ;

    @DELETE
    @Consumes("application/json")
    @Produces("application/json")
    @Path("delete/{id}")
    public String deleteREST(@PathParam("id") String id); 
}

У меня есть абстрактный класс, который реализует этот интерфейс:

public abstract class BaseREST implements ICRUD{

private final ExecutorService executorService = Executors.newCachedThreadPool();

@Override
public String createREST(String transferObject) {
    return create(transferObject).toJson();
}

@Override
public String retreiveREST(@PathParam("id") String id) {
    return retreive(id).toJson();
}


@Override
public String deleteREST(
        @PathParam("id") String id) {
    return delete(id).toJson();
}

@Override
    public void updateREST(@Suspended final AsyncResponse asyncResponse, final String transferObject) {
        executorService.submit(new Runnable() {
            @Override
            public void run() {
                asyncResponse.resume(doUpdateREST(transferObject));
            }
        });
    }      

}

И, наконец, мой класс реализации просто предоставляет PATH для ресурса:

@Path("meeting")
public class MeetingRestServices extends BaseREST {
}

Когда я пытаюсь получить доступ к моему ресурсу (при условии, что корнем контекста является /):

http://localhost:8080/webresources/meeting/retreive/0

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

ИЗМЕНИТЬ

webresources определяется ниже. Этот класс автоматически добавляется Netbeans.

@javax.ws.rs.ApplicationPath("webresources")
public class ApplicationConfig extends Application {

    @Override
    public Set<Class<?>> getClasses() {
        Set<Class<?>> resources = new java.util.HashSet<>();
        addRestResourceClasses(resources);
        return resources;
    }

    /**
     * Do not modify addRestResourceClasses() method.
     * It is automatically populated with
     * all resources defined in the project.
     * If required, comment out calling this method in getClasses().
     */
    private void addRestResourceClasses(Set<Class<?>> resources) {
        resources.add(com.dv.meetmefor.ws.impl.BinaryDataRestService.class);
        resources.add(com.dv.meetmefor.ws.impl.ImageRestServices.class);
        resources.add(com.dv.meetmefor.ws.impl.LocaleRestService.class);
        resources.add(com.dv.meetmefor.ws.impl.MeetUpRestServices.class);
        resources.add(com.dv.meetmefor.ws.impl.MeetingRestServices.class);
        resources.add(com.dv.meetmefor.ws.impl.UserAccountRestServices.class);
    }

}
4b9b3361

Ответ 1

То, что вы описали выше, выглядит хорошо. Вот правила для наследования JAX-RS, основанные на том, что вы предоставили вам.

Из спецификации JAX-RS §3.6:

Аннотации JAX-RS МОГУТ использовать для методов и параметров метода суперкласса или реализованного интерфейс. Такие аннотации наследуются соответствующим подклассом или классом реализации при условии, что метод и его параметры не имеют собственных аннотаций JAX-RS. Аннотации на суперклассе имеют приоритет над надстроенными интерфейсами. Если подкласс или реализация метод имеет любые аннотации JAX-RS, тогда все аннотации к методу супер класса или интерфейса игнорируются. Например:.

public interface ReadOnlyAtomFeed {
    @GET @Produces("application/atom+xml")
    Feed getFeed();
}

@Path("feed")
public class ActivityLog implements ReadOnlyAtomFeed {
    public Feed getFeed() {...}
}

В приведенном выше тексте ActivityLog.getFeed наследует аннотации @GET и @Produces от интерфейса. И наоборот:

@Path("feed")
public class ActivityLog implements ReadOnlyAtomFeed {
    @Produces("application/atom+xml")
    public Feed getFeed() {...}
}

В приведенном выше аннотация @GET на ReadOnlyAtomFeed.getFeed не наследуется ActivityLog .getFeed