将2 / n个(多个)参数传递给'int-jdbc:stored-proc-outbound-gateway'

时间:2014-11-03 14:16:02

标签: spring-integration

大家好我需要帮助:)

以前当我尝试只传递一个变量时,它工作正常。现在,一旦我尝试使用Spring Integration传递2 / n数量的参数,就会得到以下“有效负载”异常,我不清楚这些异常。

我得到的例外情况如下:

[2014-10-31 12:12:43,943][WARN ]GatewayProxyFactoryBean$MethodInvocationGateway.doSendAndReceive: failure occurred in gateway sendAndReceive
org.springframework.messaging.converter.MessageConversionException: failed to convert object to Message
    at org.springframework.integration.support.converter.SimpleMessageConverter.toMessage(SimpleMessageConverter.java:85)
    at org.springframework.messaging.core.AbstractMessagingTemplate.convertSendAndReceive(AbstractMessagingTemplate.java:112)
    at org.springframework.messaging.core.AbstractMessagingTemplate.convertSendAndReceive(AbstractMessagingTemplate.java:103)
...

Caused by: org.springframework.messaging.MessagingException: At most one parameter (or expression via method-level @Payload) may be mapped to the payload or Message. Found more than one on method [public abstract java.util.List com.dao.PersonalinfoDao.queryExecute(java.lang.String,java.lang.String)]
    at org.springframework.integration.gateway.GatewayMethodInboundMessageMapper.throwExceptionForMultipleMessageOrPayloadParameters(GatewayMethodInboundMessageMapper.java:235)
    at org.springframework.integration.gateway.GatewayMethodInboundMessageMapper.access$400(GatewayMethodInboundMessageMapper.java:77)
    at org.springframework.integration.gateway.GatewayMethodInboundMessageMapper$DefaultMethodArgsMessageMapper.toMessage(GatewayMethodInboundMessageMapper.java:337)
...

Bellow显示我正在做的传递2个参数:

在我的PersonalinfoDao.java文件中,我有这个:

public interface PersonalinfoDao {
/** Method to call a SQL query using spring integration mechanism */    
public List<PersonalInfo> queryExecute(String firstname, String lastname);

}

在我的PersonalinfoService.java文件中,我有这个:

public class PersonalinfoService {

@Autowired
private PersonalinfoDao personalinfoDao;

public List<PersonalInfo> dbConnect(String firstname, String lastname) {
    List<PersonalInfo> personalinfoList = personalinfoDao.queryExecute(firstname, lastname);        
    return personalinfoList;
}

}

在Gateway定义文件中,我有以下内容:

<!-- Mapper Declarations -->    
<bean id="personalinfoMapper" class="com.support.PersonalinfoMapper"/> 

<!-- Service Inheritance -->
<bean id="personalinfoService" class="com.service.PersonalinfoService"/>

<!-- Channels = For calling DAO interface methods in Spring Integration Mechanism one has to create request & response channels --> 
<int:channel id="procedureRequestChannel"/>

<!-- Gateway = DAO Interface Method Mapped to Request & Response Channels -->   
<int:gateway id="gateway_personalinfo" default-request-timeout="5000"
             default-reply-timeout="5000"
             service-interface="com.dao.PersonalinfoDao">
    <int:method name="queryExecute" request-channel="procedureRequestChannel" />
</int:gateway>

<!-- Stored Procedure Outbound-Gateway = To call a database stored procedure -->        
<int-jdbc:stored-proc-outbound-gateway  id="outbound-gateway-storedproc-personalinfo"
                                        request-channel="procedureRequestChannel"
                                        data-source="dataSource"
                                        stored-procedure-name="pkg_personalinfo_spring.proc_personalinfo_spring"
                                        expect-single-result="true"
                                        ignore-column-meta-data="true">
    <!-- Parameter Definitions -->                                      
    <int-jdbc:sql-parameter-definition  name="firstname" direction="IN"/>
    <int-jdbc:sql-parameter-definition  name="lastname" direction="IN"/>
    <int-jdbc:sql-parameter-definition name="get_ResultSet" type="#{T(oracle.jdbc.OracleTypes).CURSOR}" direction="OUT"/>

    <!-- Parameter Mappings Before Passing & Receiving -->                              
    <int-jdbc:parameter name="firstname" expression="payload"/>
    <int-jdbc:parameter name="lastname" expression="payload"/>
    <int-jdbc:returning-resultset name="get_ResultSet" row-mapper="com.support.PersonalinfoMapper"/>

</int-jdbc:stored-proc-outbound-gateway>

我知道我在上面的网关定义中做错了,特别是在使用expression="payload"时...因为对于任何给定的Getway,我只能使用一个payload。但由于我不清楚如何通过使用Map / Array / List来做到这一点,任何一个PLZ都能帮我解决这个问题吗?

非常感谢你:)

1 个答案:

答案 0 :(得分:3)

可能最简单的方法是使用@Payload注释:

public interface PersonalinfoDao {

    /** Method to call a SQL query using spring integration mechanism */    
    @Payload("#args")
    public List<PersonalInfo> queryExecute(String firstname, String lastname);    

}

或者在payload-expression="#args"方法的XML声明中使用<gateway/>

然后,框架会将有效负载设为Object[],您可以在表达式中使用payload[0]payload[1]等。