获取错误"类型为...的目标对象没有合格的方法来处理消息"

时间:2017-04-13 07:39:28

标签: spring-integration

我在我的项目中使用spring集成。 我最近为我的服务激活器PQMessageHandler添加了以下方法:

@SuppressWarnings("unchecked")
    public Message<?> getDatabaseProductName(Message<?> inMessage){
        Message<?> outMessage = null;
        String databaseProductName = null;
        try {
            //get the database name. 
            databaseProductName = DataSourceUtils.getConnection(rd).getMetaData().getDatabaseProductName();
        } catch (SQLException e) {
            throw new RuntimeException(e);
        }
        Document mainDom = XmlParserUtil.convertString2Document((String)inMessage.getPayload());
        //include database name in the response xml
        Element databaseName = mainDom.getRootElement().addElement("databaseName");
        databaseName.setText(databaseProductName);
        MessageHeaders inMsgHdrs = inMessage.getHeaders();

        MessageBuilder<?> msgBuilder = MessageBuilder.withPayload(mainDom.asXML()).copyHeaders(inMsgHdrs);
        outMessage= msgBuilder.build();
        logger.debug("\n ************************** External System Request Message ********************* \n");
        logger.debug(outMessage);
        logger.debug("\n ******************************************************************************** \n");

        return outMessage;      

    }

我已经配置了调用上述服务激活器的代码如下:

<int:channel id="PQPutUserBAInformation-Add-DatabaseProductName" />
    <int:service-activator input-channel="PQPutUserBAInformation-Add-DatabaseProductName"
                           output-channel="PQPutUserBAInformation-Database-Router"
                           ref="msgHandler" 
                           method="getDatabaseProductName" />

    <int:router input-channel="PQPutUserBAInformation-Database-Router" default-output-channel="PQPutUserBAInformation-Default-InsertUserId-Channel" resolution-required="false" expression="#xpath(payload, '//databaseName').toLowerCase().contains('db2')">
        <int:mapping value="true" channel="PQPutUserBAInformation-DB2-Request"/>
    </int:router>

上述代码在开发环境中没有任何问题时工作正常。奇怪的是,当我在客户端环境中部署我的应用程序时,我收到以下错误:

  

2017-04-10 10:41:50,525 INFO [org.springframework.scheduling.concurrent.ThreadPoolTask​​Scheduler](ServerService线程池 - 65)关闭ExecutorService&#39; taskScheduler&#39;

     

2017-04-10 10:41:50,526错误[org.springframework.web.context.ContextLoader](ServerService线程池 - 65)上下文初始化失败:org.springframework.beans.factory.BeanCreationException:创建bean时出错名称&#39; org.springframework.integration.config.ConsumerEndpointFactoryBean#345&#39;:无法解析对bean的引用&#39; org.springframework.integration.config.ServiceActivatorFactoryBean#61&#39;设置bean属性&#39; handler&#39 ;;嵌套异常是org.springframework.beans.factory.BeanCreationException:使用名称&#39; org.springframework.integration.config.ServiceActivatorFactoryBean创建bean时出错#61&#39;:FactoryBean在创建对象时抛出异常;嵌套异常是java.lang.IllegalArgumentException:[class com.dsths.cs.awd.jobs.PQMessageHandler]类型的目标对象没有合适的方法来处理消息。               在org.springframework.beans.factory.support.BeanDefinitionValueResolver.resolveReference(BeanDefinitionValueResolver.java:329)[spring-beans-3.2.2.RELEASE.jar:3.2.2.RELEASE]

我假设最近的变化导致了这个问题。日志消息并未明确说明哪个服务激活器导致了该问题。

我用Google搜索了错误并确认了这一点 1)没有拼写错误的方法属性 组态 2)该方法是公开的 3)我还没有在配置中定义requires-reply="true"属性。

有关解决问题的任何想法吗?

1 个答案:

答案 0 :(得分:0)

找出问题的根本原因。例外是由于EAR缓存。清理Linux服务器上的EAR文件夹并重新部署war文件已经解决了。