自定义Spring Integration Splitter抛出错误

时间:2015-10-26 16:17:29

标签: spring spring-integration splitter

您好我正在尝试从单个邮件中提取多个邮件,并使用拆分器元素将这些邮件拆分为多个邮件。但我的Splitter正在抛出以下错误

  

2015-10-26 15:09:06,257 [[ACTIVE] ExecuteThread:' 0' for queue:' weblogic.kernel.Default(self-tuning)'] ERROR org.springframework.web.context.ContextLoader - 上下文初始化失败   org.springframework.beans.factory.BeanCreationException:使用名称' org.springframework.integration.handler.MessageHandlerChain#1'创建bean时出错:无法创建内部bean&org.springframework.integration.config。 SplitterFactoryBean#20e2ef61'类型为[org.springframework.integration.config.SplitterFactoryBean]时设置bean属性'处理程序'用键[0];嵌套异常是org.springframework.beans.factory.BeanCreationException:使用名称' org.springframework.integration.config.SplitterFactoryBean创建bean时出错#20e2ef61':FactoryBean在创建对象时抛出异常;嵌套异常是java.lang.IllegalArgumentException:找到方法匹配的模糊参数类型[类java.lang.String]:[public java.util.List com.salesorder.payment.util.PoslogToIsellRequests.poslogTransformer(java.lang.String) ,public java.util.List com.salesorder.payment.util.PoslogToIsellRequests.split(java.util.List)]       在org.springframework.beans.factory.support.BeanDefinitionValueResolver.resolveInnerBean(BeanDefinitionValueResolver.java:282)       在org.springframework.beans.factory.support.BeanDefinitionValueResolver.resolveValueIfNecessary(BeanDefinitionValueResolver.java:121)       在

分割块:

<si:splitter>

        <bean
            class="com.ikea.pip.salesorder.payment.util.PoslogToIsellRequests"
            p:mapTaxRateCategory="${common.map.tax.rate.category}" p:buCode="${common.country.code.iso}"
            p:sourceRegion="${common.isell.order.source}" p:countryCode ="${common.country.code.iso}" />
        </si:splitter>

类的Java代码:

public class PoslogToIsellRequests implements Splitter {

private static final Logger LOG = LoggerFactory
        .getLogger(PoslogToIsellRequests.class);

private static final String ORDER= "SpecialOrderNumber";
private static XMLInputFactory inputFactory;
private final SimpleXslt transformPoslogXslt = new SimpleXslt(
        "xsl/POSLogToAddPaymentRequest.xsl");
private String sourceRegion;
private String buCode;
private String mapTaxRateCategory;
private String countryCode;
static {

    inputFactory = XMLInputFactory.newInstance();
    inputFactory.setProperty(XMLInputFactory.IS_NAMESPACE_AWARE,
            Boolean.TRUE);

}

public void setCountryCode(String countryCode) {
    this.countryCode = countryCode;
}
@Override
public List<String> split(List<String> xmlToSplit) {
    List<String> splittedPayload = new ArrayList<String>();

    for (String xml : xmlToSplit) {
        splittedPayload.addAll(split(xml));
    }

    return splittedPayload;
}
public void setSourceRegion(String sourceRegion) {
    this.sourceRegion = sourceRegion;
}

public void setBuCode(String buCode) {
    this.buCode = buCode;
}
public void setMapTaxRateCategory(String mapTaxRateCategory) {
    this.mapTaxRateCategory = mapTaxRateCategory;
}
/* @param xmlToSplit
 * @return
 * @throws Exception
 */
@Override
public List<String> split(String xmlToSplit) {
    List<String> resultSet=new ArrayList<String>();
    resultSet=poslogTransformer(xmlToSplit);
    return resultSet;
}

public List<String> poslogTransformer(String xmlToSplit) {
    List<String> resultSet=null;
    Set<String> orderNos=new HashSet<String>();
    String payload = xmlToSplit;
    try{
        orderNos= parseOrderNos(payload);

        resultSet=new ArrayList<String>();
    }
    catch (XMLStreamException e) {
        LOG.warn("Could not parse Transaction");

    }
    for(String orderno:orderNos){
        Map<String, String> parameters = createParams(orderno);
    String result = transformPoslogXslt.transform(payload,
            parameters);
    resultSet.add(result);
    }
    return resultSet;
    }
private Map<String, String> createParams(String orderNo) {
    Map<String, String> parameters = new HashMap<String, String>();


    parameters.put("sourceRegion", sourceRegion);
    parameters.put("buCode",buCode );
    parameters.put("mapTaxRateCategory",mapTaxRateCategory );
    parameters.put("orderNo",orderNo );
    parameters.put("countryCode", countryCode);
    return parameters;
}
private Set<String> parseOrderNos(String payload) throws XMLStreamException {
    Set<String> orders=new HashSet<String>();
    XMLEventReader reader;
    reader = inputFactory.createXMLEventReader(new StringReader(payload));

    String currentElement = "";

    try {
        while (reader.hasNext()) {
            XMLEvent event = reader.nextEvent();

            if (event.isStartElement()) {

                currentElement = event.asStartElement().getName()
                        .getLocalPart();


            } else if (currentElement.equals(ORDER)
                    && event.isCharacters()) {

                String value = event.asCharacters().getData();
                if(StringUtils.isNotBlank(value)){
                orders.add(value);}

            }
        }
    } finally {

        reader.close();
    }

    return orders;
}

}

Splitter界面只包含两种拆分方法。 Spring Integration中是不允许方法重载?

我可以将一个额外的查询作为参数而不是消息吗?

1 个答案:

答案 0 :(得分:1)

如果您没有明确指出拆分器中的方法名称,框架将检测多个候选方法,并且无法确定要调用哪个方法。

因此:

  

找到方法匹配的模糊参数类型[类java.lang.String]:[public java.util.List com.salesorder.payment.util.PoslogToIsellRequests.poslogTransformer(java.lang.String),public java.util。列出com.salesorder.payment.util.PoslogToIsellRequests.split(java.util.List)]

除非您指定method="split"

,否则将考虑所有公共方法进行POJO方法匹配

如果添加,框架将调用相应的split方法,具体取决于入站消息的有效负载类型。