繁体   English   中英

Apache CXF jax-rs 与 Spring Boot:如何自动配置拦截器

[英]Apache CXF jax-rs with Spring Boot: how to configure interceptors automatically

我有使用 Spring Boot 的 CXF Rest Api,所以这是我的 application.properties:

cxf.path=/
cxf.jaxrs.server.address=/api
cxf.jaxrs.component-scan=true
cxf.jaxrs.classes-scan-packages=org.apache.cxf.jaxrs.swagger,org.apache.cxf.metrics

我的端点被注释为@Component ,但问题是我不仅有组件或提供者,还有 ExceptionMappers、In/Out/Fault Interceptors。

现在我想知道它是否也可以通过属性文件进行配置。

而且我知道可能的解决方案(不要向我推荐这个):

@Bean
public Server rsServer() {
  final JAXRSServerFactoryBean endpoint = new JAXRSServerFactoryBean();

  endpoint.setInInterceptors(Arrays.<Interceptor<? extends Message>>asList(
    interceptor1,
    interceptor2,
    interceptor3
  ));

  endpoint.setOutInterceptors(Arrays.<Interceptor<? extends Message>>asList(out1));
  endpoint.setOutFaultInterceptors(Arrays.<Interceptor<? extends Message>>asList(out1));

  endpoint.setProviders(Arrays.asList(
    provider1(),
    provider2()
  ));

  endpoint.setBus(bus);

  endpoint.setAddress("/api");

  endpoint.setServiceBeans(Arrays.asList(
    endpoint1,
    endpoint2,
    ...,
    endpointN
  ));

  endpoint.setFeatures(Arrays.asList(new Swagger2Feature()));
  return endpoint.create();
}

这一点都不酷,因为可以自动配置这么多功能,现在对于一些额外的配置,我必须手动配置所有内容。

它完全破坏了使用 Spring Boot 的目的。 所以..有什么建议吗?

请检查CxfAutoConfiguration.javaAbstractSpringComponentScanServer.java ,你不需要手动创建服务器 bean,AutoConfiguration 为你做,你只需要设置属性cxf.jaxrs.component-scan=true ,它会添加所有注解@Path@Provider spring bean服务器实例的@Provider 如果您有自定义拦截器,则通过添加@Component@Provider(//with type)使其成为 bean。 对于 Swagger 和 Metrics,我通常使用@Bean创建 bean,请在此处查看示例

@karthik-prasadkart 的答案是正确的。 如果您需要更大的灵活性,您也可以将其设置为false

cxf.jaxrs.component-scan=false

并创建一个扩展org.apache.cxf.jaxrs.spring.SpringComponentScanServer@Configuration类(通常由cxf.jaxrs.component-scan=true导入)。 在这里,您可以覆盖方法并进行最后一分钟的特定更改,例如在专门用于此目的的org.apache.cxf.jaxrs.spring.AbstractSpringConfigurationFactory#finalizeFactorySetup方法中。

@Configuration
public class CxfServerConfig extends SpringComponentScanServer {

    @Override
    protected void finalizeFactorySetup(JAXRSServerFactoryBean factory) {
        super.finalizeFactorySetup(factory);

        // Don't bypasses our exception mappers
        factory.getProperties(true).put("support.wae.spec.optimization", false);
    }
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM