我有一个Java EE应用程序,其中包含一对正在运行的SOAP Web服务。我正在尝试向同一个应用程序添加REST调用;我正在关注IBM developerWorks A simple RESTful implementation
的页面他们在web.xml中以下列形式提供行
<servlet>
<servlet-name>a.b.c.RSApplication</servlet-name>
</servlet>
注意:servlet中没有servlet-class标记;我的RAD xml验证器对此感到困扰并给我一个错误。它们为servlet映射映射了相同的类:
<servlet-mapping>
<servlet-name>a.b.c.RSApplication</servlet-name>
<url-pattern>/rest/*</url-pattern>
</servlet-mapping>
RSApplication类扩展了Application,它不是Servlet扩展,如下所示:
public class RSApplication extends Application {
public Set<Class<?>> getClasses() {
Set<Class<?>> classes = new HashSet<Class<?>>();
// Resources
classes.add(a.b.c.RS.class);
// Providers
return classes;
}
}
RS类:
@Path("/rabbit")
@Stateless
public class RS {
@POST
public Response s(@Context UriInfo uriInfo, Object o) {
return sImpl(uriInfo, o);
}
@GET
public Response s2(@Context UriInfo uriInfo, Object o) {
return sImpl(uriInfo, o);
}
private Response sImpl(UriInfo uriInfo, Object o) {
return null;
}
}
所有这些都遵循与其示例相同的格式。我在我的机器上在RAD内的WebSphere上运行它,但是服务器不能运行我的应用程序,而我的web.xml中缺少servlet-class标记。所以我回到那个并加入RS课程。我将SoapUI配置为向http://localhost:9094/contextroot/rest/rabbit
发送请求,
并返回&#34;错误404:javax.servlet.UnavailableException:SRVE0201E:Servlet [a.b.c.RS]:不是servlet类&#34;
网页上的声明是&#34; JAX-RS感知的servlet容器&#34;允许上面的servlet名称和&#34; ...将...模式映射到[this]类,并且... servlet容器自动连接点,以便对...模式的引用调用适当的资源类& #34; (在我的例子中为RS)。
我看到的另一个不同之处是他们已经消耗和生产了JSON,而我还没有。如果那是问题,我会期待一个不同的错误。
有人能指出我如何配置这个以便可以进行这种神奇的点连接,甚至只是如何在web.xml中配置servlet类?
答案 0 :(得分:2)
像这样配置web.xml:
<servlet>
<servlet-name>JAX-RS Servlet</servlet-name>
<servlet-class>org.apache.wink.server.internal.servlet.RestServlet</servlet-class>
<init-param>
<param-name>javax.ws.rs.Application</param-name>
<param-value>a.b.c.RSApplication</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>JAX-RS Servlet</servlet-name>
<url-pattern>/rest/*</url-pattern>
</servlet-mapping>
或者,如果您不想使用xml配置,则可以修改应用程序子类并使用注释@ApplicationPath("rest")
,如:
@ApplicationPath("rest")
public class RSApplication extends Application{}
这可以解决您的问题。