【问题标题】:Adding multiple servlets into one web.xml将多个 servlet 添加到一个 web.xml 中
【发布时间】:2016-05-10 06:27:37
【问题描述】:

我想将 Jersey 项目 B(已经运行良好)合并/添加到新的 Jersey 项目 A 中,作为过滤器/安全层。因此,作为一个基本步骤,我在项目 A 的构建路径上添加了对项目 B 的依赖,并将其添加到构建路径中的部署程序集。我从 this 帖子中了解到,我可以通过将 servlet 放在同一个 web.xml 中并使用 <servlet-mapping> 以不同方式映射它们来做到这一点。我在尝试访问 Project B 的资源时没有任何运气。

web.xml

<servlet>
    <servlet-name>Jersey Web Application</servlet-name>
    <servlet-class>org.glassfish.jersey.servlet.ServletContainer</servlet-class>
    <init-param>
        <param-name>jersey.config.server.provider.packages</param-name>
        <param-value>org.abc.def.ba, org.pqr.xyz</param-value>
    </init-param>
    <init-param>
        <param-name>javax.ws.rs.Application</param-name>
        <param-value>org.abc.def.ba.CustomApplication</param-value>
    </init-param> 
    <load-on-startup>1</load-on-startup>
</servlet>

 <servlet-mapping>
    <servlet-name>Jersey Web Application</servlet-name>
    <url-pattern>/webapi/*</url-pattern>
</servlet-mapping>

<!-- The Servlet of Project B -->
<servlet>
    <servlet-name>Jersey Web Application 2</servlet-name>
    <servlet-class>org.glassfish.jersey.servlet.ServletContainer</servlet-     class>

<init-param>
        <param-name>javax.ws.rs.Application</param-name>
        <param-value> org.pqr.xyz.MyApplication</param-value>
    </init-param> 

    <!-- Register resources and providers under my.package. -->
   <init-param>
        <param-name>jersey.config.server.provider.packages</param-name>
        <param-value> org.pqr.xyz</param-value>
    </init-param>

    <!-- Register my custom provider (not needed if it's in my.package) AND LoggingFilter. -->
    <init-param>
        <param-name>jersey.config.server.provider.classnames</param-name>
        <param-value> org.pqr.xyz.mapper.ObjectMapperProvider</param-value>
    </init-param>

     <init-param>
        <param-name>com.sun.jersey.api.json.POJOMappingFeature</param-name>
        <param-value>true</param-value>
    </init-param>
    <init-param>
        <param-name>com.sun.jersey.config.property.packages</param-name>
        <param-value> org.pqr.xyzr</param-value>
    </init-param>
    <init-param>
        <param-name>com.sun.jersey.spi.container.ResourceFilters</param-name>
        <param-value>com.porterhead.rest.filter.ResourceFilterFactory</param-value>
    </init-param>
    <init-param>
        <param-name>readOnly</param-name>
        <param-value>false</param-value>
    </init-param>
    <load-on-startup>2</load-on-startup>
</servlet>
<servlet-mapping>
    <servlet-name>Jersey Web Application 2</servlet-name>
    <url-pattern>/rest/*</url-pattern>
</servlet-mapping>

所以,当我尝试访问http://localhost:8080/ba/webapi/myresource 时,它运行良好。但是当我尝试http://localhost:8080/ba/rest/newresource 时,我收到404 错误。我知道我错过了一些东西。感谢您对此的指导。

【问题讨论】:

    标签: servlets jersey jax-rs servlet-mapping


    【解决方案1】:

    如果您使用的是 servlet 3.0,那么您可以使用 @ApplicationPath 注解为不同的资源使用不同的应用程序路径。如果您不想使用注释,您可以使用 web.xml 实现相同的功能,如下所示

    <web-app>
    <servlet>
        <servlet-name>org.foo.rest.MyApplication</servlet-name>
    </servlet>
    ...
    <servlet-mapping>
        <servlet-name>org.foo.rest.MyApplication</servlet-name>
        <url-pattern>/resources</url-pattern>
    </servlet-mapping>
    ...
    

    有关详细信息,请参阅 Jersey documentation 了解部署选项。

    【讨论】:

    • 我也在做同样的事情,请参考我的代码。另外,当我尝试构建和运行 Tomcat 服务器时,我得到了java.lang.ClassNotFoundException: org.pqr.xyzr.MyApplication。你知道这是什么原因吗?
    • 在您的 web.xml 中,第二个项目被注释掉了。您可以上传最新版本的 web.xml 吗?
    • 它没有被注释,这是因为“/*”的使用反过来又注释了下面的代码。发布的代码是当前的 web.xml。谢谢!
    • 您在第一个 servlet 块中也添加了包 org.pqr.xyz。对吗?
    • 我已经删除了,还是一样。我这样做的想法是有一个额外的安全层,它进行身份验证以访问内层(在项目 B 中实现)。所以我希望项目 A 捕获/拦截任何端点并将其重新路由到所请求的内部/项目 B 的资源。关于如何做到这一点的任何想法?
    猜你喜欢
    • 2014-03-07
    • 2023-03-06
    • 1970-01-01
    • 2012-12-12
    • 2017-02-04
    • 1970-01-01
    • 2014-12-02
    • 2012-11-15
    • 2015-12-29
    相关资源
    最近更新 更多