Servlets 将多个servlet添加到一个web.xml中

Servlets 将多个servlet添加到一个web.xml中,servlets,jersey,jax-rs,servlet-mapping,Servlets,Jersey,Jax Rs,Servlet Mapping,我想将一个Jersey项目B(已经很好地工作)合并/添加到一个新泽西项目a中,作为一个过滤器/安全层。因此,作为一个基本步骤,我在项目a的构建路径上向项目B添加了依赖项,并在构建路径中向部署程序集添加了相同的依赖项。我从帖子中了解到,我可以通过将servlet放在相同的web.xml中,并使用以不同的方式映射它们来做到这一点。当我试图访问项目B的资源时,我没有任何运气 web.xml <servlet> <servlet-name>Jersey Web Appli

我想将一个Jersey项目B(已经很好地工作)合并/添加到一个新泽西项目a中,作为一个过滤器/安全层。因此,作为一个基本步骤,我在项目a的构建路径上向项目B添加了依赖项,并在构建路径中向部署程序集添加了相同的依赖项。我从帖子中了解到,我可以通过将servlet放在相同的
web.xml
中,并使用
以不同的方式映射它们来做到这一点。当我试图访问项目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>

Jersey Web应用程序
org.glassfish.jersey.servlet.ServletContainer
jersey.config.server.provider.packages
org.abc.def.ba,org.pqr.xyz
javax.ws.rs.Application
org.abc.def.ba.CustomApplication
1.
Jersey Web应用程序
/webapi/*
Jersey Web应用程序2
org.glassfish.jersey.servlet.ServletContainer
javax.ws.rs.Application
org.pqr.xyz.MyApplication
jersey.config.server.provider.packages
org.pqr.xyz
jersey.config.server.provider.classnames
org.pqr.xyz.mapper.ObjectMapperProvider
com.sun.jersey.api.json.POJOMappingFeature
真的
com.sun.jersey.config.property.packages
org.pqr.xyzr
com.sun.jersey.spi.container.ResourceFilters
com.porterhead.rest.filter.ResourceFilterFactory
只读
假的
2.
Jersey Web应用程序2
/休息/*

因此,当我尝试访问
http://localhost:8080/ba/webapi/myresource
,它工作得很好。但是当我尝试
http://localhost:8080/ba/rest/newresource
,我得到一个
404
错误。我知道我错过了一些东西。非常感谢您的指导。

如果您使用的是servlet 3.0,那么您可以使用@ApplicationPath annotation为不同的资源使用不同的应用程序路径。如果您不想使用注释,可以使用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>
...

org.foo.rest.MyApplication
...
org.foo.rest.MyApplication
/资源
...


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

如果您使用的是servlet 3.0,那么您可以使用@ApplicationPath annotation为不同的资源使用不同的应用程序路径。如果您不想使用注释,可以使用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>
...

org.foo.rest.MyApplication
...
org.foo.rest.MyApplication
/资源
...


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

我也在做同样的事情,请参阅我的代码。另外,当我试图构建和运行Tomcat服务器时,我得到了
java.lang.ClassNotFoundException:org.pqr.xyzr.MyApplication
。你知道原因吗?在你的web.xml中,第二个项目被注释了。你能上传你的web.xml的最新版本吗?它没有被注释,这是因为使用了“/*”来注释下面的代码。发布的代码是当前的web.xml。谢谢您已经在第一个servlet块中添加了包org.pqr.xyz。是否正确?我已经删除了它,仍然是一样的。我这样做的想法是有一个额外的安全层,它进行身份验证以访问内层(在项目B中实现)。因此,我希望项目A捕获/截获任何端点,并将其重新路由到所请求的内部/项目B的资源。关于如何做到这一点,有什么想法吗?我正在做同样的事情,请参考我的代码。另外,当我试图构建和运行Tomcat服务器时,我得到了
java.lang.ClassNotFoundException:org.pqr.xyzr.MyApplication
。你知道原因吗?在你的web.xml中,第二个项目被注释了。你能上传你的web.xml的最新版本吗?它没有被注释,这是因为使用了“/*”来注释下面的代码。发布的代码是当前的web.xml。谢谢您已经在第一个servlet块中添加了包org.pqr.xyz。是否正确?我已经删除了它,仍然是一样的。我这样做的想法是有一个额外的安全层,它进行身份验证以访问内层(在项目B中实现)。因此,我希望项目A捕获/拦截任何端点,并将其重新路由到所请求的内部/项目B的资源。您知道如何做到这一点吗?