WebSphere REST 服务错误 "FFDC Incident emitted"

WebSphere REST service error "FFDC Incident emitted"

我有一个 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 映射映射了相同的 class:

<servlet-mapping>
  <servlet-name>a.b.c.RSApplication</servlet-name>
  <url-pattern>/rest/*</url-pattern>
</servlet-mapping>

RSApplication class 扩展了 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 class:

@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 class。我将 SoapUI 配置为向 http://localhost:9094/contextroot/rest/rabbit 发送请求, 然后回来 "Error 404: javax.servlet.UnavailableException: SRVE0201E: Servlet [a.b.c.RS]: not a servlet class"

网页上的声明是 "JAX-RS aware servlet container" 允许上述 servlet 名称和“...将...模式映射到 [this] class,并且... servlet 容器自动连接点,以便对 ... 模式的引用调用适当的资源 class”(在我的示例中为 RS)。

我看到的唯一其他区别是它们有 JSON 被消费和生产,而我还没有。如果那是问题所在,我希望会出现不同的错误。

有人可以告诉我如何配置它以便可以发生这种神奇的点连接,甚至可以告诉我如何在 web.xml 中配置 servlet class 吗?

像这样配置您的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{}

这应该可以解决您的问题。