ContainerResponseFilter未执行

时间:2015-03-16 16:05:10

标签: java rest jersey jax-rs cors

我想在启用了cors的情况下使用Jax-R构建REST-API。所以我用谷歌搜索了怎么做并发现了这个:

http://www.developerscrappad.com/1781/java/java-ee/rest-jax-rs/java-ee-7-jax-rs-2-0-cors-on-rest-how-to-make-rest-apis-accessible-from-a-different-domain/

解决方案是一个ResponseFilter,它为每个响应添加一些头信息,以便用户的浏览器知道,允许跨域访问。

因为我在执行任何请求时没有执行ResponseFilter(尝试过GET,POST和OPTIONS),我再次搜索并发现:

ContainerResponseFilter not working

@lefloh给出了一个很好的答案,这听起来是逻辑(删除注释@PreMatching)。它这样做了,但是当我执行Http-Request时,我的过滤器没有被调用。

这是我的代码:

import javax.ws.rs.container.ContainerRequestContext;
import javax.ws.rs.container.ContainerResponseContext;
import javax.ws.rs.container.ContainerResponseFilter;
import javax.ws.rs.ext.Provider;
import java.io.IOException;

@Provider
public class RESTServiceResponseFilter implements ContainerResponseFilter {

    @Override
    public void filter(ContainerRequestContext parContainerRequestContext, ContainerResponseContext parContainerResponseContext) throws IOException {
        parContainerResponseContext.getHeaders().add( "Access-Control-Allow-Origin", "*" );
        parContainerResponseContext.getHeaders().add( "Access-Control-Allow-Credentials", "true" );
        parContainerResponseContext.getHeaders().add( "Access-Control-Allow-Methods", "GET, POST, DELETE, PUT" );
        parContainerResponseContext.getHeaders().add( "Access-Control-Allow-Headers", "Content-Type" );
    }
}

我继续使用Google搜索并发现,我忘记将过滤器添加到web.xml。所以我也这样做了:

<servlet>
    <display-name>webinterface.api</display-name>
    <servlet-name>JAX-RS REST Servlet</servlet-name>
    <servlet-class>com.sun.jersey.spi.container.servlet.ServletContainer</servlet-class>
    <init-param>
        <param-name>com.sun.jersey.config.property.packages</param-name>
        <param-value>de.tsystems.lbus.apprestserver</param-value>
    </init-param>
    <init-param>
        <param-name>com.sun.jersey.spi.container.ContainerResponseFilters</param-name>
        <param-value>de.apprestserver.filter.RESTServiceResponseFilter</param-value>
    </init-param>
    <load-on-startup>1</load-on-startup>
</servlet>

<servlet-mapping>
    <servlet-name>JAX-RS REST Servlet</servlet-name>
    <url-pattern>/TNR/*</url-pattern>
</servlet-mapping>

我现在没有更多的想法,想问你,如果你可能有我的解决方案。提前谢谢!

1 个答案:

答案 0 :(得分:1)

您正在使用Jersey 1(可以通过web.xml中的com.sun.jersey来判断)。您正在使用(或向我们展示)的过滤器实现是泽西岛2.这有细微的差别,但这是一个主要的区别。后者不适用于泽西岛1号。

它甚至编译的事实(如果是这种情况)意味着你需要摆脱一些依赖。您拥有的类是JAX-RS 2类(接口)。您可能拥有的任何JAX-RS / Jersey 2依赖关系都可以摆脱它们。他们打得不好(也许不是问题的原因,但摆脱它们以避免任何混乱)

  • 泽西岛1 == com.sun.jersey(保留)
  • 泽西岛2 == org.glassfish.jersey(摆脱)
  • JAX-RS 2 api == javax.ws.rs-api(摆脱)
  

请参阅here for Jersey 1 implementation and configuration