REST服务不需要部分URI

时间:2016-09-21 12:30:57

标签: java rest

我有一个要求,需要在请求URI中放置版本以命中相应的服务。 例如:如果路径如下:localhost:8080 / context-root / rest / v1 / company

然后可以使用以下网址点击此服务: 本地主机:8080 /上下文根/ REST / V1 /公司 本地主机:8080 /上下文根/休息/公司

要在休息服务过滤器中实现此功能,我会在第二个URL被点击时添加v1。 当我使用带有servlet com.sun.jersey.spi.spring.container.servlet.SpringServlet的jersey 1.8时工作正常

但是当我使用带有servlet org.glassfish.jersey.servlet.ServletContainer的jersey 2.4时,它无法正常工作,因为没有/ rest / company的路径,所以无法完全访问过滤器。 v1被添加到过滤器中。

我在想是否可以点击部分网址(最多/最多),在过滤器中我会更改请求网址以获取正确的路径。

使用web.xml:

#define PARAM_NAME Param
#define GETNAME_(a) #a
#define GETNAME(a) GETNAME_(a)

int Param;
printf("%s = %i\n", GETNAME(PARAM_NAME), PARAM_NAME);

不使用web.xml

<servlet>
        <servlet-name>jersey-serlvet</servlet-name>
        <servlet-class>
            com.sun.jersey.spi.spring.container.servlet.SpringServlet
        </servlet-class>
        <init-param>
            <param-name>com.sun.jersey.config.property.packages</param-name>
            <param-value>com.abc.ws.rest</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.spi.container.ContainerRequestFilters</param-name>
        <param-value>com.abc.filters.RestServiceFilter</param-value>
    </init-param>
        <load-on-startup>1</load-on-startup>
    </servlet>
    <servlet-mapping>
        <servlet-name>jersey-serlvet</servlet-name>
        <url-pattern>/rest/*</url-pattern>
    </servlet-mapping>

工作一个正在命中过滤器类甚至/ rest /公司URL被命中,而不工作一个没有命中过滤器为相同的URL

REST端点类:

<servlet>
        <servlet-name>jersey-serlvet</servlet-name>
        <servlet-class>org.glassfish.jersey.servlet.ServletContainer</servlet-class>
        <init-param>
            <param-name>jersey.config.server.provider.packages</param-name>
            <param-value>com.abc.ws.rest</param-value>
        </init-param>        
        <init-param>
            <param-name>jersey.config.server.provider.classnames</param-name>
            <param-value>com.abc.filter.RestServiceFilter</param-value>
        </init-param>
        <init-param>
            <param-name>com.sun.jersey.api.json.POJOMappingFeature</param-name>
            <param-value>true</param-value>
        </init-param>
        <load-on-startup>1</load-on-startup>
    </servlet>
    <servlet-mapping>
        <servlet-name>jersey-serlvet</servlet-name>
        <url-pattern>/rest/*</url-pattern>
    </servlet-mapping>

更新了pom.xml

    @Path("/v1/company")
public class CompanyRestService {
}

RestServiceFilter代码:

<dependency>
            <groupId>org.glassfish.jersey.containers</groupId>
            <artifactId>jersey-container-servlet</artifactId>
            <version>2.4.1</version>
            <exclusions>
                <exclusion>
                    <groupId>org.glassfish.hk2.external</groupId>
                    <artifactId>asm-all-repackaged</artifactId>
                </exclusion>
                <exclusion>
                    <groupId>org.glassfish.hk2.external</groupId>
                    <artifactId>cglib</artifactId>
                </exclusion>
            </exclusions>
        </dependency>
        <dependency>
            <groupId>javax.servlet</groupId>
            <artifactId>javax.servlet-api</artifactId>
            <version>3.1.0</version>
        </dependency>
        <dependency>
            <groupId>org.glassfish.jersey.media</groupId>
            <artifactId>jersey-media-json-jackson</artifactId>
            <version>2.4.1</version>
        </dependency>

1 个答案:

答案 0 :(得分:0)

我认为这是你的问题:

<servlet>
        <servlet-name>Jersey Web Application</servlet-name>
        <servlet-class>org.glassfish.jersey.servlet.ServletContainer</servlet-class>
        <init-param>
            <param-name>javax.ws.rs.Application</param-name>
            <param-value>com.abc.ws.rest</param-value>
        </init-param>
        ...
    </servlet>

https://jersey.java.net/documentation/2.4/deployment.html