我有一个带有一对正在工作的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{}


这样可以解决您的问题。

08-28 15:20