我有一个 Java EE 应用程序,其中有一对正在运行的 SOAP Web 服务。我正在尝试向同一应用程序添加 REST 调用;我正在关注 IBMdeveloperWorks A simple RESTful implementation 的页面
他们在 web.xml 中以以下形式给出行
<servlet>
<servlet-name>a.b.c.RSApplication</servlet-name>
</servlet>
注意:servlet内没有servlet-class标签;我的 RAD xml validator 对此感到困扰并给我一个错误。他们确实为 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
发送请求,
并返回“错误 404:javax.servlet.UnavailableException:SRVE0201E:Servlet [a.b.c.RS]:不是 servlet 类”
网页上的声明是“JAX-RS 感知 servlet 容器”允许上述 servlet 名称,并且“... 将 ... 模式映射到 [this] 类,并且 ... servlet 容器自动连接这些点,以便对 ... 模式的引用调用适当的资源类”(在我的示例中为 RS)。
我看到的唯一的其他区别是它们有 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{}
这应该可以解决您的问题。
关于java - WebSphere REST 服务错误 "FFDC Incident emitted",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31664685/