Spring 集成:自定义入站通道适配器没有此类方法异常
Spring integration: no such method exception for custom inbound channel adapter
我正在尝试从我的 As2MessageHandler
class 调用 processMessage
方法作为我使用自定义入站通道适配器进入 spring 集成的入口点。但是我一直收到这个错误,说当它明显在 class:
中时找不到方法
org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'as2.source': Invocation of init method failed; nested exception is java.lang.IllegalArgumentException: no such method 'processMessage' is available on class com.as2example.myexample.handler.As2MessageHandler
as2MessageHandler class:
@Component
public class As2MessageHandler extends AbstractProcessorModule implements IProcessorStorageModule {
private static final Logger LOGGER = LoggerFactory.getLogger(As2MessageHandler.class);
@Override
public boolean canHandle(@Nonnull String s, @Nonnull IMessage iMessage, @Nullable Map<String, Object> map) {
LOGGER.info(" Handle Info:" + s);
return s.equals(DO_STORE);
}
@Override
public void handle(@Nonnull String s, @Nonnull IMessage iMessage, @Nullable Map<String, Object> map) throws AS2Exception {
LOGGER.info("----- AS2 MESSAGE RECEIVED !!! ------");
LOGGER.info(iMessage.getContentType());
LOGGER.info(iMessage.getContentDisposition());
LOGGER.info(iMessage.getAsString());
processMessage(iMessage);
}
public String processMessage(IMessage message) {
LOGGER.info("BEGIN PROCESSING MESSAGE");
return message.getAsString();
}
}
integration.xml 文件:
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:int="http://www.springframework.org/schema/integration"
xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="
http://www.springframework.org/schema/beans
https://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/integration
https://www.springframework.org/schema/integration/spring-integration.xsd">
<int:channel id="as2MessageChannel">
<int:interceptors>
<int:wire-tap channel="logger"/>
</int:interceptors>
</int:channel>
<int:logging-channel-adapter id="logger" level="DEBUG"/>
<int:inbound-channel-adapter id="as2" ref="as2MessageHandler" method="processMessage" channel="as2MessageChannel">
</int:inbound-channel-adapter>
<int:service-activator input-channel="as2MessageChannel" ref="orderServiceImpl" auto-startup="true"/>
</beans>
我的应用程序class:
@SpringBootApplication
@ImportResource("classpath:/integration/integration.xml")
public class MyApplication implements ServletContextListener {
public static void main(String[] args) {
SpringApplication.run(MyApplication.class, args);
}
@Override
public void contextDestroyed (final ServletContextEvent sce)
{
ServletConfig.shutDown ();
AS2WebAppListener.staticDestroy ();
}
}
任何人都可以深入了解为什么 spring 集成无法识别来自 As2MessageHandler class 的 processMethod 吗?我试过更改方法以使用 messagebuilder 和 return 消息类型,但这不是问题所在。现在我想它必须是别的东西。
错误正确。它可能会有点误导,因为方法的签名是错误的,而不是它的存在。因此,由于入站通道适配器是流的开始,因此实际上不能为生成消息数据的方法提供任何输入。因此,不清楚您对 IMessage
作为方法输入的期望是什么。
不清楚你的设计是什么,但是<int:inbound-channel-adapter>
中的POJO方法被轮询器调用作为消息的数据源。换句话说,作为源的 POJO 方法不能有参数——只有 return。这就是抛出该异常的原因。
我在您的 As2MessageHandler
中没有看到任何可以用作入站通道适配器中消息源的内容。这个看起来更像是一个服务激活器。请修改您的设计以支持真正可以用作该 AS2 协议中的数据源的其他内容。
我正在尝试从我的 As2MessageHandler
class 调用 processMessage
方法作为我使用自定义入站通道适配器进入 spring 集成的入口点。但是我一直收到这个错误,说当它明显在 class:
org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'as2.source': Invocation of init method failed; nested exception is java.lang.IllegalArgumentException: no such method 'processMessage' is available on class com.as2example.myexample.handler.As2MessageHandler
as2MessageHandler class:
@Component
public class As2MessageHandler extends AbstractProcessorModule implements IProcessorStorageModule {
private static final Logger LOGGER = LoggerFactory.getLogger(As2MessageHandler.class);
@Override
public boolean canHandle(@Nonnull String s, @Nonnull IMessage iMessage, @Nullable Map<String, Object> map) {
LOGGER.info(" Handle Info:" + s);
return s.equals(DO_STORE);
}
@Override
public void handle(@Nonnull String s, @Nonnull IMessage iMessage, @Nullable Map<String, Object> map) throws AS2Exception {
LOGGER.info("----- AS2 MESSAGE RECEIVED !!! ------");
LOGGER.info(iMessage.getContentType());
LOGGER.info(iMessage.getContentDisposition());
LOGGER.info(iMessage.getAsString());
processMessage(iMessage);
}
public String processMessage(IMessage message) {
LOGGER.info("BEGIN PROCESSING MESSAGE");
return message.getAsString();
}
}
integration.xml 文件:
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:int="http://www.springframework.org/schema/integration"
xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="
http://www.springframework.org/schema/beans
https://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/integration
https://www.springframework.org/schema/integration/spring-integration.xsd">
<int:channel id="as2MessageChannel">
<int:interceptors>
<int:wire-tap channel="logger"/>
</int:interceptors>
</int:channel>
<int:logging-channel-adapter id="logger" level="DEBUG"/>
<int:inbound-channel-adapter id="as2" ref="as2MessageHandler" method="processMessage" channel="as2MessageChannel">
</int:inbound-channel-adapter>
<int:service-activator input-channel="as2MessageChannel" ref="orderServiceImpl" auto-startup="true"/>
</beans>
我的应用程序class:
@SpringBootApplication
@ImportResource("classpath:/integration/integration.xml")
public class MyApplication implements ServletContextListener {
public static void main(String[] args) {
SpringApplication.run(MyApplication.class, args);
}
@Override
public void contextDestroyed (final ServletContextEvent sce)
{
ServletConfig.shutDown ();
AS2WebAppListener.staticDestroy ();
}
}
任何人都可以深入了解为什么 spring 集成无法识别来自 As2MessageHandler class 的 processMethod 吗?我试过更改方法以使用 messagebuilder 和 return 消息类型,但这不是问题所在。现在我想它必须是别的东西。
错误正确。它可能会有点误导,因为方法的签名是错误的,而不是它的存在。因此,由于入站通道适配器是流的开始,因此实际上不能为生成消息数据的方法提供任何输入。因此,不清楚您对 IMessage
作为方法输入的期望是什么。
不清楚你的设计是什么,但是<int:inbound-channel-adapter>
中的POJO方法被轮询器调用作为消息的数据源。换句话说,作为源的 POJO 方法不能有参数——只有 return。这就是抛出该异常的原因。
我在您的 As2MessageHandler
中没有看到任何可以用作入站通道适配器中消息源的内容。这个看起来更像是一个服务激活器。请修改您的设计以支持真正可以用作该 AS2 协议中的数据源的其他内容。