Mule 3.3 TCP自定义协议和Spring注入@Autowired不起作用

时间:2012-09-20 10:34:42

标签: spring mule

当我使用自定义tcp协议时,我在Mule中遇到问题,并且在自定义协议内部使用@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
  }
}

Mule配置代码段

<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上的流读取输入和处理读取方法时,适配器始终为null。但奇怪的是,如果我只是定义ContentLengthProtocol bean但没有将TCP连接器中的bean作为自定义协议引用,则spring注入工作正常,而适配器不为null。

有人能让我对这里发生的事情有所启发吗? 任何帮助都非常感谢。 感谢。

2 个答案:

答案 0 :(得分:0)

Mule和Spring注释之间可能存在注入冲突。 According to the doc,我认为使用@Inject也不会有所帮助。

因此,最好定期进行Spring注射:

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

答案 1 :(得分:0)

我找到了改变@Autowired进程的确切问题。我还没有告知一些细节,Adapter类实际上是一个包含MyBatis映射器的服务。使用spring-mybatis集成配置MyBatis映射器,org.mybatis.spring.mapper.MapperScannerConfigurer是特定的。此类(bean)扫描某些要代理的包。不知怎的,如果我将这个bean与一个spring bean和mule结合起来,@ Autowired不起作用,即使使用<property>手动将对象注入ContentLengthProtocol也无法正常工作(适配器bean被注入,但是不是Adapter bean中的MyBatis映射器类。作为一种解决方法,我设法使用古老而繁琐的方式使其工作,即org.mybatis.spring.mapper.MapperFactoryBean bean。基本上,我必须为每个映射器声明这个bean。