RESTEasy (jax-rs),web.xml 中的多个包声明?

RESTEasy (jax-rs), multiple packages declaration in web.xml?

如何在 web.xml 中为 RESTEasy jax-rs 提供程序声明多个包?

如果我有:

 <web-app id="WebApp_ID" version="2.4"
        xmlns="http://java.sun.com/xml/ns/j2ee"
            xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee
        http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd">
        <display-name>Restful Web Application</display-name>

    <!-- this need same with resteasy servlet url-pattern -->
        <context-param>
            <param-name>resteasy.servlet.mapping.prefix</param-name>
            <param-value>/rest</param-value>
        </context-param>

        <servlet>
            <servlet-name>resteasy-servlet</servlet-name>
            <servlet-class> org.jboss.resteasy.plugins.server.servlet.HttpServletDispatcher </servlet-class>
            <init-param>
                <param-name>javax.ws.rs.Application</param-name>
                <param-value>part1.MessageApplication</param-value>
            </init-param>
        </servlet>

        <servlet-mapping>
            <servlet-name>resteasy-servlet</servlet-name>
            <url-pattern>/rest/*</url-pattern>
        </servlet-mapping>
    </web-app>

有效。

但是如果我有 :

然后更改 web.xml 的声明(基于 ,可能已经在 J​​ersey 工作)

<servlet>
        <servlet-name>resteasy-servlet</servlet-name>
        <servlet-class> org.jboss.resteasy.plugins.server.servlet.HttpServletDispatcher </servlet-class>
        <init-param>
            <param-name>javax.ws.rs.Application</param-name>
            <param-value>part1.MessageApplication;part2.MessageApplication2</param-value>
        </init-param>
    </servlet>

每当我尝试访问包“part2”中的@Path-mapped-class时,它会抛出:

java.lang.RuntimeException: java.lang.ClassNotFoundException: part1.MessageApplication;part2.MessageApplication2 from

请注意,我知道我已经将 @Path-mapped-class 更改为不同的 url 路径,例如 @Path("controller2").

如何在 web.xml 中正确配置它?

不确定我是否清楚地理解你的问题。 you provided in your question is about specifying multiple packages. But looks like you are dealing with two Application subclasses。这是另一回事。

在这种情况下,您应该注册两个 HttpServletDispatcher 映射到不同的 URI 模式,如下所示:

<!-- Application 1 (part1.MessageApplication) mapped to /rest/app1/* -->
<servlet>
    <servlet-name>resteasy-application1</servlet-name>
    <servlet-class>org.jboss.resteasy.plugins.server.servlet.HttpServletDispatcher</servlet-class>
    <init-param>
        <param-name>javax.ws.rs.Application</param-name>
        <param-value>part1.MessageApplication</param-value>
    </init-param>
</servlet>
<servlet-mapping>
    <servlet-name>resteasy-application1</servlet-name>
    <url-pattern>/rest/app1/*</url-pattern>
</servlet-mapping>

<!-- Application 2 (part2.MessageApplication2) mapped to /rest/app2/* -->
<servlet>
    <servlet-name>resteasy-application2</servlet-name>
    <servlet-class>org.jboss.resteasy.plugins.server.servlet.HttpServletDispatcher</servlet-class>
    <init-param>
        <param-name>javax.ws.rs.Application</param-name>
        <param-value>part2.MessageApplication2</param-value>
    </init-param>
</servlet>
<servlet-mapping>
    <servlet-name>resteasy-application2</servlet-name>
    <url-pattern>/rest/app2/*</url-pattern>
</servlet-mapping>

每个 Application subclass is mapped to a path that serves as the base URI for the resource URIs provided by @Path 注释。

例如,当您支持 API 的多个版本时,您可以有多个 Application 子 class。对于简单的应用程序,您很可能不需要它。

您可能不需要 web.xml

根据您的 ,您使用的是 WildFly 8。它与 Servlet 3.0 兼容,因此您甚至不需要 web.xml 简单应用程序的部署描述符。大多数配置,例如注册 servlet、过滤器和侦听器都可以通过注释完成。

如果您没有为基于 Maven 的 Web 应用程序项目提供 web.xml 部署描述符,则需要将 maven-war-plugin to ignore the missing web.xml file by setting the failOnMissingWebXml 配置 属性 配置为 false在您的项目 pom.xml 文件中:

<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-war-plugin</artifactId>
    <version>2.6</version>
    <configuration>
        <failOnMissingWebXml>false</failOnMissingWebXml>
    </configuration>
</plugin>

由于 maven-war-plugin, the default value for failOnMissingWebXml 的 3.0.0 版本已从 true 更改为 false。您可以使用最新版本并省略该配置 属性.

如果出于某种原因,你想保留 web.xml,它可以很简单:

<web-app xmlns="http://java.sun.com/xml/ns/javaee"
          xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
          xsi:schemaLocation="http://java.sun.com/xml/ns/javaee 
          http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"
          version="3.0">

</web-app>

关于Applicationclass

的几句话

关于 JAX-RS,用 @ApplicationPath 注释您的 Application subclass 指定资源的基本 URI classes:

@ApplicationPath("api")
public SampleApplication extends Application {

}

在上面的示例中,JAX-RS 运行时将扫描 classJAX-RS 组件的路径并自动注册它们。

如果您想手动注册您的资源和提供者(防止 JAX-RS 运行时自动注册组件),请覆盖 getClasses() and/or the getSingletons() 方法:

@ApplicationPath("api")
public SampleApplication extends Application {

    @Override
    public Set<Class<?>> getClasses() {
        Set<Class<?>> resources = new HashSet<>();
        resources.add(MyResource.class);
        resources.add(MyOtherResource.class);
        return resources;
    }
}

有关 Application class 的更多详细信息,此 可以为您提供一些见解。

管理您的依赖关系

值得一提的是RESTEasy 3.x is shipped with WildFly。如果您只使用 JAX-RS API,则以下依赖项将为您提供所需的一切:

<dependency>
    <groupId>javax</groupId>
    <artifactId>javaee-api</artifactId>
    <version>7.0</version>
</dependency>

如果您需要使用 RESTEasy API 中的任何类型,请在 provided 范围内添加 RESTEasy 3.x 依赖项。它告诉 Maven 容器将提供该依赖项,因此它们不会随您的应用程序一起提供。未能提供正确的范围可能会导致一些奇怪的错误和令人头疼的问题。有关作用域的更多详细信息,请查看 dependency scope documentation.