2012-09-20 122 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%。我已将我的答案作为解决方案发布。无论如何,感谢您的帮助,它帮助我找到真正的问题。 –