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