【问题标题】:RESTEasy (jax-rs), multiple packages declaration in web.xml?RESTEasy(jax-rs),web.xml 中的多个包声明?
【发布时间】:2017-04-20 06:18:53
【问题描述】:

如何在 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的声明(基于this way,可能已经在泽西岛起作用了)

<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

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

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

【问题讨论】:

    标签: rest jakarta-ee jax-rs resteasy wildfly-8


    【解决方案1】:

    不确定我是否清楚了解您的问题。您在问题中提供的link 是关于指定多个包的。但看起来您正在处理两个 Application 子类。这是另一回事。

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

    <!-- 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 子类都映射到一个路径,该路径用作@Path 注释提供的资源URI 的基本URI。

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

    您可能不需要web.xml

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

    如果您没有为基于 Maven 的 Web 应用程序项目提供 web.xml 部署描述符,则需要通过将 failOnMissingWebXml 配置属性设置为 @ 来配置您的 maven-war-plugin 以忽略缺少的 web.xml 文件987654352@在你的项目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 3.0.0 版起,failOnMissingWebXml 的默认值已从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>
    

    关于Application 类的几句话

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

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

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

    如果您想手动注册资源和提供程序(防止 JAX-RS 运行时自动注册组件),请覆盖 getClasses() 和/或 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 类的更多详细信息,此answer 可以为您提供一些见解。

    管理您的依赖项

    值得一提的是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

    【讨论】:

    • 谢谢,顺便说一句,这正是我的问题2 Application subclasses 在不同的包中,顺便说一句,因为我是 jax-rs 的新手,你只使用单个javax.ws.rs.core.Application 用于跨多个控制器/服务,还是只使用一个? .我稍后会尝试你的建议,我现在在外面。
    • @Hey-men-whatsup 这取决于您要实现的目标。例如,当我支持 API 的多个版本时,我通常有多个 Application 子类。对于简单的应用程序,您不需要它。每个Application 子类都映射到一个路径,该路径用作@Path 注释提供的所有资源URI 的基本URI。
    • 顺便说一句,如果我记得我在余生中都尝试过,但不知何故它在 RESTEasy 中的表现有所不同。
    • @Hey-men-whatsup 你用的是什么容器?
    • @Hey-men-whatsup 有关Application 类的更多详细信息,请参阅此answer。我会用一些细节更新我的答案,这些细节可以为你指明一个好的方向。
    猜你喜欢
    • 2014-02-03
    • 1970-01-01
    • 2020-09-08
    • 2012-02-12
    • 1970-01-01
    • 1970-01-01
    • 2018-12-08
    • 2014-08-26
    • 1970-01-01
    相关资源
    最近更新 更多