【问题标题】:WebSphere REST service error "FFDC Incident emitted"WebSphere REST 服务错误“已发出 FFDC 事件”
【发布时间】:2015-07-27 22:55:06
【问题描述】:

我有一个 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-mapping 映射了同一个类:

<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]: not a servlet class”

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

我看到的唯一其他区别是它们使用和生成 JSON,而我还没有。如果这是问题所在,我预计会出现不同的错误。

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

【问题讨论】:

    标签: java web-services rest soap websphere


    【解决方案1】:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-07-01
      • 1970-01-01
      • 2019-02-05
      • 2020-10-07
      • 1970-01-01
      相关资源
      最近更新 更多