Java RESTful Web服务 - 注释接口而不是类

时间:2011-10-03 10:07:37

标签: java rest tomcat interface jersey

我正在尝试设置一个简单的Web服务(在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 Web服务?

2 个答案:

答案 0 :(得分:0)

使用JAX-RS注释的接口允许您创建远程代理客户端。我们使用Apache CXF执行此操作,但我还没有尝试使用Jersey。

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>

我现在可以通过调用方法来使用这个spring bean。我不必创建客户端,也不必关心它定义的不同RS服务的相对路径。

答案 1 :(得分:0)

至于使用Interface for REST Service,这是一个好主意恕我直言。但是有一件事没有注释接口本身将其留给实现。这样您可以获得更大的灵活性。例如,

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){...}
}

至于Jersey代理检查: https://jersey.java.net/project-info/2.0/jersey/project/jersey-proxy-client/dependencies.html