嗨,我试图从单个消息中提取多个消息,并使用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;
}
}
的器界面是只包含两个分裂法。春季集成中不允许使用方法重载吗?
一个额外的查询可以将字符串输入作为参数而不是消息吗?