当我使用自定义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。
有人能让我对这里发生的事情有所启发吗? 任何帮助都非常感谢。 感谢。
答案 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。