1

当我使用自定义 tcp 协议时,我在 Mule 中遇到问题,并且在自定义协议内部有一个使用 @Autowired 注释的弹簧依赖注入。

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

有人可以告诉我这里发生的事情吗?任何帮助都将不胜感激。谢谢。

4

2 回答 2

0

Mule 和 Spring 注释之间可能存在注入冲突。根据 doc,我认为 using@Inject也无济于事。

所以最好进行常规的 Spring 注入:

<spring:bean id="contentLengthProtocol"
             class="id.company.protocol.ContentLengthProtocol"
             p:adapter-ref="adapter"
             p:inboundEndpoint-ref="atm-inbound" />
于 2012-09-20T16:51:11.880 回答
0

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

于 2012-09-24T17:34:46.773 回答