Автообнаружение ресурсов JAX-RS с помощью CXF в приложении Spring
Возможно ли, если Apache CXF (2.7.0) до автоматически обнаружит ресурсы JAX-RS в пути к классам? То есть классы, аннотированные с помощью @Path
.
Я использую CXF в приложении Spring, и мне приходится вручную объявлять ресурсы со следующим XML, даже если ресурсы успешно обнаружены Spring <context:component-scan ...>
.
<jaxrs:server id="myService" address="/myService">
<jaxrs:serviceBeans>
<ref bean="myResource1" />
<ref bean="myResource2" />
<ref bean="myResource3" />
</jaxrs:serviceBeans>
</jaxrs:server>
Я хотел бы избежать этого (как я могу сделать с другими реализациями JAX-RS, такими как resteasy), потому что в моем случае это сложнее поддерживать, и это заставляет меня объявлять мои зависимости bean в Spring Файл конфигурации XML.
Ответы
Ответ 1
В настоящее время не существует способа сделать это с помощью конфигурации Spring в CXF 2.7. Если вы посмотрите на resteasy, они внедрили BeanFactoryPostProcessor SpringBeanProcessor.java, который ищет @Path и @Provider. Возможно, что-то подобное можно было бы сделать в CXF, но оно пока не реализовано. Похоже, вы не единственный, кого интересует CXF-3725
Ответ 2
Этот код выполняет трюк:
@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, и все готово.
Ответ 3
Протестировано и работает в cxf 3.0.4.
<jaxrs:server address="/" basePackages="a.b.c"/>
Не забывайте упоминать cxf-сервлет в web.xml
Ответ 4
В дополнение к тому, что было предложено: он действительно работает в версии 3.0.0-milestone2, можно было бы просто создать только объявление верхнего уровня jaxrs-сервера и установить атрибут basePackages, который может содержать одно или несколько имен пакетов, разделенных пробелами.