繁体   English   中英

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

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM