2012-09-20 79 views
1

我在使用自定義tcp協議時在Mule中遇到問題,並且在自定義協議內部有使用@Autowired註釋的彈簧依賴注入。Mule 3.3 TCP自定義協議和彈簧注入@Autowired不起作用

CustomProtocol.java

public class ContentLengthProtocol extends AbstractByteProtocol{ 
    @Autowired 
    private Adapter adapter; 

    @Lookup("atm-inbound") 
    private ImmutableEndpoint inboundEndpoint; 

    public ContentLengthProtocol(){ 
     super(true); 
    } 

    public Object read(InputStream is) throws IOException{ 
    // do some reading 
    } 
} 

騾配置片段

<spring:beans> 
    <spring:bean id="adapter" class="id.company.dao.Adapter"/> 
    <spring:bean id="contentLengthProtocol" class="id.company.protocol.ContentLengthProtocol"/> 
</spring:beans> 
<tcp:connector name="TCPConnector" validateConnections="true" sendBufferSize="0" receiveBufferSize="1024" receiveBacklog="50" reuseAddress="true" keepAlive="true" clientSoTimeout="0" serverSoTimeout="0" socketSoLinger="0" doc:name="TCPConnector"> 
    <tcp:custom-protocol ref="contentLengthProtocol"/> 
</tcp:connector> 
<tcp:endpoint name="tcp-inbound" address="tcp://localhost:1234" connector-ref="TCPConnector" doc:name="TCP"/> 
<flow name="AdapterFlow" doc:name="AdapterFlow"> 
    <tcp:inbound-endpoint ref="tcp-inbound" doc:name="Inbound TCP"/> 
    <echo-component doc:name="Echo"/> 
</flow> 

當ContentLengthProtocol流讀取輸入和處理方法讀取,適配器總是零。但奇怪的是,如果我只是定義了ContentLengthProtocol bean,但沒有將TCP連接器中的bean作爲自定義協議引用,那麼Spring注入將像往常一樣工作,並且適配器不爲空。

有人能給我啓發這裏發生的事情嗎? 任何幫助,慷慨讚賞。 謝謝。

回答

0

我發現了改變@Autowired過程確切的問題。有些細節我沒有通知,Adapter類實際上是一個包含MyBatis映射器的服務。 MyBatis映射器是使用spring-mybatis集成配置的,具體來說就是org.mybatis.spring.mapper.MapperScannerConfigurer。這個類(bean)掃描某個要被代理的包。不知何故如果我將這個bean與spring bean和mule結合在一起,@Autowired不起作用,即使使用<property>手動將對象注入ContentLengthProtocol也不能正常工作(適配器bean被注入,但不是適配器內的MyBatis映射器類豆)。作爲一種解決方法,我設法使用老的和繁瑣的方式工作,這就是org.mybatis.spring.mapper.MapperFactoryBean bean。基本上這個bean必須爲我擁有的每個映射器聲明。

0

Mule和Spring註釋之間可能存在注入衝突。 According to the doc,我不認爲使用@Inject也會有幫助。

所以它可能會更好去正規春注射:

<spring:bean id="contentLengthProtocol" 
      class="id.company.protocol.ContentLengthProtocol" 
      p:adapter-ref="adapter" 
      p:inboundEndpoint-ref="atm-inbound" /> 
+0

嗨大衛,我試過了,但它不工作。正如[doc](http://www.milesoft.org/documentation/display/MULE3USER/Lookup+Annotation)所述,@Lookup僅適用於自定義組件和變換器。但我想要的是向自定義TCP協議注入spring bean。你有其他想法嗎? –

+0

好的,改變了我的建議,建議使用簡單注射而不是自動佈線。 –

+0

嗨大衛,我試過你的解決方案,但它不工作100%。我已將我的答案作爲解決方案發布。無論如何,感謝您的幫助,它幫助我找到真正的問題。 –