2013-02-06 53 views
1

我目前面臨的問題是將CXF Web服務與Spring @Configurable註釋混合在一起。CXF和Spring @Configurable問題

從一個側面,我有我CXF Web服務完全可行且配置是這樣的:

<import resource="classpath:some-other-context.xml" /> 

<jaxws:server id="Init" 
     serviceClass="package.to.my.ServiceInterface" 
     address="/"> 
     <jaxws:serviceBean> 
      <bean class="package.to.my.BADematInitImpl"> 
      </bean> 
     </jaxws:serviceBean> 
</jaxws:server> 

<context:spring-configured /> 

在我一些,其他-context.xml中是一個包含以下Bean的我的Spring配置:

@Configurable(autowire = Autowire.BY_TYPE) 
public class MyConfigurable { 

    @Autowired(required=true) 
    private A a; 

    @Autowired(required=true) 
    private B b; 

    @Autowired(required=true) 
    private C c; 

... 

} 

但是當我嘗試創建MyConfigurable bean的新實例到我的服務,我得到一個NullPointerException異常由於爲空看重的應該,自動裝配A,B和C對象。

有什麼想法?

+0

A,B,C豆是否都創建完成?您是否使用過或其他任何生成bean的方式? –

+0

是的,因爲當我以編程方式獲得Spring上下文**時,我可以看到它們。 – Ugo

回答

0

我終於找到了問題所在。

我需要這個配置加入到我的第三個部分應用程序的XML文件:

<context:load-time-weaver/> 

...而這個參數添加到我的JVM啓動命令行

-javaagent:"path\to\my\spring-agent.jar" 

它只是像一個魅力。

據我所知,這是因爲Spring需要在某個時間點擁有一個管理其AOP部分的實體,以便依賴性被很好地注入。如果有人進一步解釋,這將是有趣的。

1

@ConfigurableAOP加載時織造材料所使用的標記。我假設你沒有使用任何AOP,因爲在你的問題中沒有提到它。第二件事:您的@Autowired註釋中不必使用required=true,因爲true是默認值required。我建議你改變你這樣的代碼:

這些添加到您spring配置文件中的元素:

<context:component-scan base-package="your.pckg.toscan"/> 

文件說:

掃描類路徑註釋的組件,這將是自動註冊爲Spring beans的 。默認情況下,Spring提供的 @Component,@Repository,@Service和@Controller原型將被檢測到 。

<context:annotation-config/> 

文件說:

激活在bean類要檢測各種註解:Spring的 @Required和@Autowired,以及JSR 250的@PostConstruct, @PreDestroy和@Resource (如果可用),JAX-WS的@WebServiceRef(如果有 可用),EJB3的@EJB(如果可用)以及JPA的@PersistenceContext 和@PersistenceUnit(如果可用)。或者,您可以選擇 爲這些註釋激活單個BeanPostProcessors。

因此改變你的代碼:

@Component 
public class MyConfigurable { 

    @Autowired 
    private A a; 

    @Autowired 
    private B b; 

    @Autowired 
    private C c; 

... 

} 

一切都應該工作得很好。

+0

嗨,保利斯,謝謝你的回答。我已經設置了上面提到的XML配置,並且將MyConfigurable類的註釋從\ @Configurable更改爲\ @Component並沒有成功。 – Ugo