2011-10-03 80 views
2

我想設置這是這樣的一個簡單的Web服務(部署在Tomcat)的:Java的RESTful Web服務 - 註解的接口,而不是類

@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> 

但是,當我嘗試在湯姆部署貓我得到以下(而不是預期的錯誤):

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

哪個(不復制在這裏,整個跟蹤)告訴我,雖然找到了API接口不能實例化。

我該如何聲明哪些實現類實際上充當REST Web服務?

+1

我不知道,你可以註釋接口與JAX-RS註釋。如果你有多個實現,它會混淆容器。你爲什麼要註解界面? –

+0

沒有特別的原因。我只是在試驗。我真的不知道這是不是一個好主意。 – gpol

+0

註解接口的一個很好的理由是共享其餘服務器和其他客戶端之間的接口。這使得在許多jax-rs實現中開發客戶端幾乎是微不足道的(遠程代理)。我面臨同樣的問題。 –

回答

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服務的相對路徑。

+0

非常有趣。 –

0

至於使用接口的REST服務這是一個好主意恕我直言。但有一點不註釋Interface本身就是爲了實現而留下的。這樣你可能會有更多的靈活性。例如,

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