如何制作RESTEasy响应过滤器?

时间:2014-11-06 09:20:48

标签: java jax-rs resteasy

我在尝试使RESTEasy过滤器工作时遇到了麻烦。我确定我错过了什么,但我不知道是什么。

我正在使用以下方法进行测试:

@GET
@Produces(MediaType.APPLICATION_JSON)
public List<User> listAll(@QueryParam("start") Integer startPosition, @QueryParam("max") Integer maxResult) {
    String hql = "SELECT DISTINCT u FROM User u LEFT JOIN FETCH u.tasks ORDER BY u.id";
    TypedQuery<User> findAllQuery = em.createQuery(hql, User.class);
    if (startPosition != null) {
        findAllQuery.setFirstResult(startPosition);
    }
    if (maxResult != null) {
        findAllQuery.setMaxResults(maxResult);
    }
    final List<User> results = findAllQuery.getResultList();
    return results;
}

这是我的web.xml:

<web-app xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    version="3.0"
    xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd">
    <display-name>tasks-webapp</display-name>
    <session-config>
        <session-timeout>30</session-timeout>
    </session-config>
    <mime-mapping>
        <extension>ico</extension>
        <mime-type>image/x-icon</mime-type>
    </mime-mapping>
    <servlet>
        <servlet-name>javax.ws.rs.core.Application</servlet-name>
        <load-on-startup>1</load-on-startup>
    </servlet>
    <context-param> 
        <param-name>resteasy.providers</param-name>
        <param-value>br.com.tasks.rest.CORSFilter</param-value>
    </context-param>
    <servlet-mapping>
        <servlet-name>javax.ws.rs.core.Application</servlet-name>
        <url-pattern>/api/*</url-pattern>
    </servlet-mapping>
</web-app>

最后,我的过滤器:

@Provider
public class CORSFilter implements ContainerResponseFilter {

   @Override
   public void filter(final ContainerRequestContext requestContext,
                      final ContainerResponseContext cres) throws IOException {
      cres.getHeaders().add("Access-Control-Allow-Origin", "*");
      cres.getHeaders().add("Access-Control-Allow-Headers", "origin, content-type, accept, authorization");
      cres.getHeaders().add("Access-Control-Allow-Credentials", "true");
      cres.getHeaders().add("Access-Control-Allow-Methods", "GET, POST, PUT, DELETE, OPTIONS, HEAD");
      cres.getHeaders().add("Access-Control-Max-Age", "1209600");
   }

}

结合使用它不起作用。我在过滤器中留下了一个断点,它从未被调用过。而我正在测试邮差,我的标题丢失了。我在这里看到了其他问题而且我的指示没有成功。我尝试使用Application类,也没有尝试过。

有人帮帮我吗?我很感激。 :)

1 个答案:

答案 0 :(得分:1)

您是否尝试过添加:

<context-param> 
    <param-name>resteasy.scan.providers</param-name>
    <param-value>true</param-value>
</context-param>

按照here的说明注册您的提供商?因为默认值似乎是false