2016-02-16 100 views
2

我正在将Spring Boot与Apache CXF集成。 Everyhthing是确定的,但我不能让SearchContext到控制器内工作:Spring + Apache CXF:SearchContextProvider未初始化

@Context 
private SearchContext context; 

public @ResponseBody List<Users> getAll(@Context SearchContext context, @RequestParam String search){ 
    .... 
} 

的SearchContext没有正确注射,如不被SearchContextProvider在包org.apache.cxf.jaxrs.ext.search创建。

我启动CXF的Servlet与此豆:

@Bean 
public ServletRegistrationBean cxfServlet() { 
    CXFServlet cxf = new CXFServlet(); 
    ServletRegistrationBean registration = new ServletRegistrationBean(cxf, "/api/*"); 
    return registration; 
} 

我使用一个基于Java的配置,无XML。 在一个基于XML的配置,似乎这标签是必需的:

<jaxrs:providers> 
     <bean class="org.apache.cxf.jaxrs.ext.search.SearchContextProvider"/> 
</jaxrs:providers> 

我如何可以声明在servlet的基于Java的配置提供者?

+0

为什么要这样做? Wy应该关注cxf注释和课程......您正在混合2种不兼容的技术。 –

+0

@ m-denium从春季官方文档:_Jersey 1.x和Apache CXF在开箱即用的情况下工作得非常好,如果您只是在应用程序环境中将它们的Servlet或过滤器注册为\ @Bean_ – Roberto

+0

正确,我没有在那里说Apache CXF将无法工作,或者您可以自动连接Apache CXF Web服务。但是,您不能在spring控制器上使用apache CXF中的类型/注释。这是行不通的。 –

回答

0

在你的主要配置类,添加:

@ComponentScan("org.apache.cxf.jaxrs") 

由于类(SearchContextProvider)已与@Provider注解,Spring可以把它捡起来,如果被扫描它。假设您已经在自己的软件包上进行了组件扫描,您可以添加如下的jaxrs软件包:

@ComponentScan({ "com.something", "org.apache.cxf.jaxrs" }) 
+0

好提示,但我现在得到'调用方法public abstract org.apache.cxf.jaxrs.ext.search.SearchCondition org.apache.cxf.jaxrs.ext.search.SearchContext.getCondition(java.lang.String,java。 lang.Class)不是访问方法!' – Roberto