[英]Java RESTful Web Service - Annotate an Interface instead of a Class
我正在尝试设置一个简单的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服务?
至于将接口用于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){...}
}
至于Jersey代理,请检查以下内容: https : //jersey.java.net/project-info/2.0/jersey/project/jersey-proxy-client/dependencies.html
通过使用JAX-RS注释接口,可以创建远程代理客户端。 我们使用Apache CXF进行此操作,但我尚未使用Jersey进行过尝试。
我可以在我的Spring配置中使用EG;
<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服务的相对路径。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.