我有一个带有一对正在工作的SOAP Web服务的Java EE应用程序。我试图将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类标签的情况下运行我的应用程序。因此,我返回到该类别并加入RS类。我将SoapUI配置为向
http://localhost:9094/contextroot/rest/rabbit
发送请求,并返回“错误404:javax.servlet.UnavailableException:SRVE0201E:Servlet [a.b.c.RS]:不是Servlet类”
网页上的声明是“支持JAX-RS的servlet容器”允许使用上面的servlet名称,“ ...将...模式映射到[this]类,并且... servlet容器自动将点连接起来因此对...模式的引用会调用相应的资源类”(在我的示例中为RS)。
我看到的唯一其他区别是它们已经使用和产生了JSON,而我还没有任何JSON。如果那是问题,我会期待一个不同的错误。
有人可以指出我如何配置它,以便进行神奇的点连接,甚至只是如何配置web.xml中的servlet类吗?
最佳答案
像这样配置您的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{}
这样可以解决您的问题。