将JAX-RS 1.1升级到JAX-RS 2.0需要有关web.xml部署的帮助

时间:2012-09-26 14:59:43

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

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

以下是详细信息。 为JAX-RS 2.0添加了以下jars

Jersey的客户端 - 2.0 m07-1 Jersey的共同-2.0-m07-1 Jersey的容器的servlet-2.0-m07-1 Jersey的容器servlet的芯-2.0-m07-1 球衣服务器-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-定位器2.1.28 HK2-API-2.1.28 番石榴13.0 CGLIB-2.1.28 ASM-全重新包装-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
    }
    }

尝试使用以下网址访问我的资源API IPADDRESS:8080 / ConfigLiteJersey2 /配置/ configset / ID

获取HTTP状态404未找到。

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

4 个答案:

答案 0 :(得分:2)

如果您希望Jersey扫描您的资源包,请将您的param-name更改为:

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

答案 1 :(得分:1)

我正在使用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包含我的提供者类,它实现了Jersey提供的ExceptionMapper

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

答案 2 :(得分:0)

如果您使用的是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(稍微改编自jersey页面以符合你的例子):

<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
}

答案 3 :(得分:0)

经过长时间的谷歌搜索,我以这种方式配置了它并且它完美地运行了

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>

这解决了我的问题。谢谢