Java RESTful Web Service - аннотируйте интерфейс вместо класса - PullRequest
2 голосов
/ 03 октября 2011

Я пытаюсь настроить простой веб-сервис (развернуть на tomcat), который выглядит следующим образом:

@Path("/api")
public interface Api {

    @GET
    @Path("categ")
    public String getCateg();
}

и у меня есть следующий класс, реализующий интерфейс:

public class RAPI implements API {
    public String getCateg() { ... }
}

Мой web.xml выглядит следующим образом:

<servlet>
    <servlet-name>API</servlet-name>
    <servlet-class>com.sun.jersey.spi.container.servlet.ServletContainer</servlet-class>
    <init-param>
        <param-name>com.sun.jersey.config.property.packages</param-name>
        <param-value>com.api.resources</param-value> <!-- THIS IS CORRECT -->
    </init-param>
    <load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
    <servlet-name>API</servlet-name>
    <url-pattern>/api/*</url-pattern>
</servlet-mapping>

Но когда я пытаюсь выполнить развертывание на Tomcat, я получаю следующее (довольно ожидаемая ошибка):

 com.sun.jersey.api.core.ScanningResourceConfig init
 INFO: No provider classes found.

Который (не скопировал всю трассировку здесь) говорит мне, что, хотя он нашел интерфейс API, он не может его создать.

Как я могу объявить, какой из реализующих классов будет фактически действовать как веб-сервис REST?

Ответы [ 2 ]

0 голосов
/ 10 октября 2013

Что касается использования интерфейса для службы REST, то это хорошая идея, ИМХО. Но одна вещь не аннотирует сам интерфейс, оставляя его для реализации. Таким образом, вы можете иметь больше гибкости. Например,

public Interface Readable {

    @GET
    @Path("/read/{id}")
    public String read(@PathParam("id") Integer id);
}

@Service
@Path("/book")
public class Book implements Readable, ... {
    ...
    public String read(Integer id){...}
}

Что касается прокси Джерси, проверьте это: https://jersey.java.net/project-info/2.0/jersey/project/jersey-proxy-client/dependencies.html

0 голосов
/ 03 октября 2011

Наличие интерфейса, аннотированного JAX-RS, позволяет создавать удаленные прокси-клиенты.Мы делаем это с Apache CXF, но я не пробовал это с Джерси.

EG в моей конфигурации Spring я могу иметь;

<jaxrs:client id="myClient" inheritHeaders="true"
            address="http://myhost/rs"
            serviceClass="com.mycorp.restful.MyServiceInterface">
  <jaxrs:headers>
    <entry key="Accept" value="application/xml"/>
  </jaxrs:headers>
</jaxrs:client>

Теперь я могу использовать этот bean-компонент простовызывая методы.Мне не нужно создавать клиента, и мне не нужно заботиться об относительных путях различных сервисов RS, которые он определяет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...