您好我正在尝试从单个邮件中提取多个邮件,并使用拆分器元素将这些邮件拆分为多个邮件。但我的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中是不允许方法重载?
我可以将一个额外的查询作为参数而不是消息吗?
答案 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"
。
如果添加,框架将调用相应的split
方法,具体取决于入站消息的有效负载类型。