为什么在使用带有@Provider注释的Spring时仍然需要resteasy.providers?

时间:2013-06-03 08:18:19

标签: java spring jax-rs web.xml resteasy

我有一个使用Spring的Resteasy应用程序,其中包含ContainerRequestFilterContainerResponseFilter实现,注释为@Provider。该应用程序使用的是Resteasy版本3.0-beta-6

这些过滤器在添加到web.xml中的resteasy.providers上下文参数时按预期工作,如下所示:

<context-param>
      <param-name>resteasy.providers</param-name>
      <param-value>foo.filter.LoggingRequestFilter,
                   foo.filter.LoggingResponseFilter</paramvalue>
</context-param> 

如果我从这里删除过滤器,则不再调用它们。

我假设这些提供商在使用org.jboss.resteasy.plugins.spring.SpringContextLoaderListener时会自动注册Resteasy。对我来说奇怪的是,它适用于以前版本的Resteasy中的PreProcessInterceptor实现,并且仍然适用于v3,但Filters和ExceptionMappers不会自动注册。

问题

  1. 如果类使用resteasy.providers注释并由Spring扫描,为什么需要@Provider上下文参数?
  2. 是否有一种以编程方式在运行时设置这些提供程序?

1 个答案:

答案 0 :(得分:8)

为了让Spring扫描提供程序,我必须在我的Spring Java配置类中将includeFilters参数添加到@ComponentScan

@ComponentScan(value = "com.foo", 
               includeFilters = @ComponentScan.Filter(type = FilterType.ANNOTATION, value = Provider.class))

您也可以使用@Component@Provider注释它们,Spring会确保在使用Resteasy SpringContextLoaderListener时它们会被Resteasy检测到。