2015-10-26 44 views
0

嗨,我试图从单个消息中提取多个消息,并使用splitter元素将它们拆分为多个消息。但我的分配器是抛出下面的错误自定义弹簧集成分离器投掷错误

2015年10月26日15:09:06257 [[ACTIVE] ExecuteThread: '0' 的队列: 'weblogic.kernel.Default(自调谐)'] ERROR org.springframework.web.context.ContextLoader - 上下文初始化失败 org.springframework.beans.factory.BeanCreationException:创建名为'org.springframework.integration.handler.MessageHandlerChain#1'的bean时出错:无法创建内部bean'org。 spring.framework.integration.config.SplitterFactoryBean#20e2ef61'类型[org.springframework.integration.config.SplitterFactoryBean],同时用键[0]设置bean属性'handlers';嵌套异常是org.springframework.beans.factory.BeanCreationException:使用名称'org.springframework.integration.config.SplitterFactoryBean#20e2ef61'创建bean时出错:FactoryBean在创建对象时抛出异常;嵌套异常是java.lang.IllegalArgumentException:发现方法匹配的模糊参数类型[类java.lang.String]:[public java.util.List com.salesorder.putil.PoslogToIsellRequests.poslogTransformer(java.lang.String) ,public java.util.List com.salesorder.payment.util.PoslogToIsellRequests.split(java.util.List)] at org.springframework.beans.factory.support.BeanDefinitionValueResolver.resolveInnerBean(BeanDefinitionValueResolver.java:282) at 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; 
} 

}

的器界面是只包含两个分裂法。春季集成中不允许使用方法重载吗?

一个额外的查询可以将字符串输入作为参数而不是消息吗?

回答

1

如果您没有在分离器中明确识别方法名称,则框架将检测到多个方法候选项,并且将无法确定要调用哪个方法。

因此:

实测值暧昧参数类型[类java.lang.String用于方法匹配:[公共的java.util.List com.salesorder.payment.util.PoslogToIsellRequests.poslogTransformer(java.lang中.String),公共java.util.List的com.salesorder.payment.util.PoslogToIsellRequests.split(java.util.List中)

,除非你指定method="split"所有的公共方法被认为是POJO方法匹配。

如果补充说明,框架将调用适当的split方法,具体取决于入站消息的有效负载类型。