【问题标题】:Upgrading JAX-RS 1.1 to JAX-RS 2.0 need help on web.xml deployment将 JAX-RS 1.1 升级到 JAX-RS 2.0 需要有关 web.xml 部署的帮助
【发布时间】:2012-09-18 06:04:36
【问题描述】:

我正在做一个项目来升级我现有的 Web 应用程序,该应用程序是在 JAX-RS 1.12 中开发并在 tomcat 7 中运行的。现在我正在将它升级到 JAX-RS2.0。在 tomcat 服务器启动期间,我的资源没有被加载?

以下是详细信息。 在 JAX-RS 2.0 的 jar 下方添加

jersey-client-2.0-m07-1 jersey-common-2.0-m07-1 jersey-container-servlet-2.0-m07-1 jersey-container-servlet-core-2.0-m07-1 jersey-server-2.0-m07-1 javax.ws.rs-api-2.0-m10 osgi-资源定位器-1.0.1 javax.inject-2.1.28 javax.inject-1 hk2-utils-2.1.28 hk2-locator-2.1.28 hk2-api-2.1.28 番石榴-13.0 cglib-2.1.28 asm-all-repackaged-2.1.28

在 Web.xml 中

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns="http://java.sun.com/xml/ns/javaee" xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
id="WebApp_ID" version="2.5">
<display-name>ConfigLiteJersey2</display-name>

<!-- Jersey Servlet to Support JAXRS Services -->
<servlet>
    <servlet-name>ConfigLiteServices</servlet-name>
    <servlet-class>org.glassfish.jersey.servlet.ServletContainer</servlet-class>        
     <init-param>
        <param-name>javax.ws.rs.core.Application</param-name>
        <param-value>com.cisco.config.resource</param-value>
    </init-param>
    <load-on-startup>1</load-on-startup>
</servlet>
     <servlet-mapping>
    <servlet-name>ConfigLiteServices</servlet-name>
    <url-pattern>/config/*</url-pattern>
</servlet-mapping>

我的资源文件

@Path("/configset")
public class ConfigSetResource {   
    @POST
@Path("/id{configsetid: (/[^/]+?)?}")
@Consumes({ MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML })
@Produces({ MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML })
public ConfigSetResponse getConfigSet(@PathParam("configsetid") String sConfigSetId)    throws    Exception {
     //Code
    }
    }

尝试使用以下 URL 访问我的资源 API ipaddress:8080/ConfigLiteJersey2/config/configset/id

获取 HTTP 状态 404 未找到。

看起来我没有在 web.xml 中给出正确的 servletclass 映射。请分享您对此的看法

【问题讨论】:

    标签: java rest jakarta-ee jquery jax-rs


    【解决方案1】:

    如果您希望 Jersey 扫描您的包中的资源,请将您的参数名称更改为:

    <param-name>jersey.config.server.provider.packages</param-name>
    

    【讨论】:

      【解决方案2】:

      我使用的是 Jersey 2.15,下面是工作配置:

      <servlet>
          <servlet-name>emper</servlet-name>
          <servlet-class>org.glassfish.jersey.servlet.ServletContainer</servlet-class>
          <init-param>
              <param-name>javax.ws.rs.Application</param-name>
              <param-value>com.le.config.ResourceConfiguration</param-value>
          </init-param>
          <init-param>
              <param-name>jersey.config.server.provider.packages</param-name>
              <param-value>com.le.exceptions</param-value>
          </init-param>
      </servlet>
      <servlet-mapping>
          <servlet-name>emper</servlet-name>
          <url-pattern>/api/*</url-pattern>
      </servlet>  
      

      我知道的一件好事是,我们可以注册提供程序类,如 全局异常处理程序。因此com.le.exceptions 包含我的提供者类,它实现了泽西岛提供的ExceptionMapper

      另外,我们需要创建一个org.glassfish.jersey.server.ResourceConfig 的子类并将其注册为我们的jax-rs 应用程序。

      【讨论】:

        【解决方案3】:

        如果您使用的是 Servlet 3.0 版,我建议您在此处遵循球衣手册中的示例:https://jersey.java.net/documentation/latest/deployment.html#deployment.servlet.3.descriptor

        创建一个实现 javax.ws.rs.core.Application 的类,比如 org.foo.rest.ConfigLiteApplication。然后使您的 web.xml 如下所示(改编自球衣页面以稍微匹配您的示例):

        <web-app>
            <servlet>
                <servlet-name>org.foo.rest.ConfigLiteApplication</servlet-name>
                <load-on-startup>1</load-on-startup>
            </servlet>
            <servlet-mapping>
                <servlet-name>org.foo.rest.ConfigLiteApplication</servlet-name>
                <url-pattern>/config/*</url-pattern>
            </servlet-mapping>
        </web-app>
        

        这应该适用于 JAX-RS 1.1 和 JAX-RS 2.0,并且应该与球衣版本无关,因为您永远不需要命名任何球衣类。 ConfigLiteApplication 类应该加载你想要包含的资源,例如改编自http://tomee.apache.org/examples-trunk/rest-example-with-application/README.html

        @ApplicationPath("/config")
        public class ConfigLiteApplication extends Application {
            public Set<Class<?>> getClasses() {
                return new HashSet<Class<?>>(Arrays.asList(ConfigSetResource.class));
            }
        }
        

        现代 IDE 可能会为您管理此类。

        另外,如果我是你,如果你希望在 /id 上匹配,我会小心检查这个正则表达式匹配

        @Path("/id{configsetid: (/[^/]+?)?}")
        

        我会考虑将其拆分为多个函数,或者尝试避免这种正则表达式。例如

        @POST
        @Path("/id")
        public ConfigSetResponse getConfigSet() {
             return this.getConfigSet(null);
        }
        @POST
        @Path("/id/{configsetid}")
        public ConfigSetResponse getConfigSet(@PathParam("configsetid") String sConfigSetId) {
             //Code
        }
        

        【讨论】:

          【解决方案4】:

          经过长时间的谷歌搜索,我以这种方式配置了我的,它运行良好

          build.gradle 应该是这样的

          compile 'log4j:log4j:1.2.7'
          compile 'org.slf4j:slf4j-log4j12:1.6.6'
          compile 'org.glassfish.jersey.containers:jersey-container-servlet:2.6'
          

          ApplicationConfig.java 文件应该是这样的

          @ApplicationPath("/app")
          public class ApplicationConfig extends ResourceConfig {
          
              public ApplicationConfig() {
                  packages("com.flexisaf.resources");
          
              }
          }
          

          你的 web.xml 文件应该是这样的

          <?xml version="1.0" encoding="UTF-8"?>
          <web-app version="3.0" 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">
              <!-- Default page to serve -->
          
              <session-config>
                  <session-timeout>30</session-timeout>
              </session-config>
              <display-name>SAFHRMS</display-name>
              <servlet>
                  <servlet-name>com.flexisaf.safhrms.client.config.ApplicationConfig</servlet-name>
          
                  <load-on-startup>1</load-on-startup>
              </servlet>
              <servlet-mapping>
                  <servlet-name>com.flexisaf.safhrms.client.config.ApplicationConfig</servlet-name>
                  <url-pattern>/app/*</url-pattern>
              </servlet-mapping>
          
              <welcome-file-list>
                  <welcome-file>safhrms.jsp</welcome-file>
              </welcome-file-list>
          
          </web-app>
          

          这解决了我的问题..谢谢

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多