5

我创建了一个 RestEASY 拦截器,允许我在我的 web 服务调用完成后在 HTTP 响应上设置标头值。我的代码看起来像这样......

@Provider
@ServerInterceptor
@Precedence("HEADER_DECORATORS")
public class MyHeaderInterceptor implements
        MessageBodyWriterInterceptor {

    @Override
    public void write(MessageBodyWriterContext context) throws IOException,
            WebApplicationException {

             ....do stuff here....
        }
}

但是,当我调用我的服务时,拦截器永远不会被调用。我看到 web 服务调用成功完成,但我的拦截器中的任何代码都没有被执行。除此之外,我还需要做些什么来注册我的拦截器吗?是否必须在其他任何地方声明?是否需要包含任何特殊的 web.xml 参数?

4

2 回答 2

8

您必须在 web.xml 的 resteasy.providers 上下文参数中列出拦截器。向 Interceptor 类添加注解是不够的。

<context-param>
      <param-name>resteasy.providers</param-name>
      <param-value>org.resteasy.test.ejb.exception.FooExceptionMapper</param-value>
</context-param>
于 2011-03-22T11:31:47.200 回答
1

至于 Resteasy 2.x,您还可以让它自动扫描 WEB-INF/lib jar 和 WEB-INF/classes 目录以查找 @Provider 和 JAX-RS 资源类(@Path、@GET、@POST 等)并注册它们:

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

或者可以让 Resteasy 扫描 @Provider 类并注册它们:

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

在这两种情况下,您都不必在 web.xml 中明确列出拦截器。

否则,如果上下文参数 'resteasy.scan' 和 'resteasy.scan.providers' 都未启用(默认情况下它们被禁用),您可能需要指定要注册的完全限定 @Provider 类名的逗号分隔列表在“resteasy.providers”元素内:

<context-param>
    <param-name>resteasy.providers</param-name>
    <param-value>com.test.Interceptor1,com.test.Interceptor2</param-value>
</context-param>

这取自文档:http ://docs.jboss.org/resteasy/docs/2.3.3.Final/userguide/html_single/index.html#d0e72

于 2016-12-05T16:30:31.747 回答