복붙노트

[SPRING] Spring 애플리케이션에서 CXF를 사용하여 JAX-RS 리소스를 자동 검색

SPRING

Spring 애플리케이션에서 CXF를 사용하여 JAX-RS 리소스를 자동 검색

Apache CXF (2.7.0)에서 클래스 경로의 JAX-RS 자원을 자동으로 검색 할 수 있습니까? 즉, @Path로 주석 처리 된 클래스입니다.

Spring 애플리케이션에서 CXF를 사용하고 있으며 Spring이 context 에 의해 리소스가 성공적으로 발견 되더라도 다음 XML로 리소스를 수동으로 선언해야합니다.

<jaxrs:server id="myService" address="/myService">
    <jaxrs:serviceBeans>
        <ref bean="myResource1" />
        <ref bean="myResource2" />
        <ref bean="myResource3" />
    </jaxrs:serviceBeans>
</jaxrs:server>

내 경우에는 유지하기가 어려우므로 Spring XML 구성 파일에서 bean 의존성을 선언하도록 강요하므로 (다른 JAX-RS 구현과 같이 할 수 있음) 피하고 싶다.

해결법

  1. ==============================

    1.현재 CXF 2.7에서 Spring 구성으로이 작업을 수행하는 방법이없는 것처럼 보입니다. resteasy를 살펴보면 @Path와 @Provider를 찾는 BeanFactoryPostProcessor SpringBeanProcessor.java를 구현했다. 비슷한 것이 CXF에서 아마도 수행 될 수 있지만 아직 구현되지 않은 것처럼 보입니다. CXF-3725에만 관심있는 사람이 아닌 것 같습니다.

    현재 CXF 2.7에서 Spring 구성으로이 작업을 수행하는 방법이없는 것처럼 보입니다. resteasy를 살펴보면 @Path와 @Provider를 찾는 BeanFactoryPostProcessor SpringBeanProcessor.java를 구현했다. 비슷한 것이 CXF에서 아마도 수행 될 수 있지만 아직 구현되지 않은 것처럼 보입니다. CXF-3725에만 관심있는 사람이 아닌 것 같습니다.

  2. ==============================

    2.cxf 3.0.4에서 테스트 및 작업 중입니다.

    cxf 3.0.4에서 테스트 및 작업 중입니다.

    <jaxrs:server address="/" basePackages="a.b.c"/>
    

    web.xml에 cxf-servlet을 언급하는 것을 잊지 마라.

  3. ==============================

    3.이 코드는 트릭을 수행합니다.

    이 코드는 트릭을 수행합니다.

    @Configuration
    @ComponentScan
    @ImportResource({"classpath:META-INF/cxf/cxf.xml"})
    public class Context {
        @Autowired
        private ApplicationContext ctx;
    
        @Bean
        public Server jaxRsServer() {
            LinkedList<ResourceProvider> resourceProviders = new LinkedList<>();
            for (String beanName : ctx.getBeanDefinitionNames()) {
                if (ctx.findAnnotationOnBean(beanName, Path.class) != null) {
                    SpringResourceFactory factory = new SpringResourceFactory(beanName);
                    factory.setApplicationContext(ctx);
                    resourceProviders.add(factory);
                }
            }
    
            JAXRSServerFactoryBean factory = new JAXRSServerFactoryBean();
            factory.setBus(ctx.getBean(SpringBus.class));
            factory.setProviders(Arrays.asList(new JacksonJsonProvider()));
            factory.setResourceProviders(resourceProviders);
            return factory.create();
        }
    }
    

    CXFServlet을 web.xml에 넣어두면됩니다.

  4. ==============================

    4.제안 된 것 외에도 3.0.0-milestone2에서 실제로 작동합니다. 최상위 수준의 jaxrs 서버 선언 만 수행하고 하나 이상의 공백으로 패키지 이름을 구분할 수있는 basePackages 속성을 설정합니다.

    제안 된 것 외에도 3.0.0-milestone2에서 실제로 작동합니다. 최상위 수준의 jaxrs 서버 선언 만 수행하고 하나 이상의 공백으로 패키지 이름을 구분할 수있는 basePackages 속성을 설정합니다.

  5. from https://stackoverflow.com/questions/13520821/autodiscover-jax-rs-resources-with-cxf-in-a-spring-application by cc-by-sa and MIT license