当前位置: 首页 > 知识库问答 >
问题:

自定义Spring集成分路器抛出错误

壤驷康裕
2023-03-14

嗨,我正在尝试从单个消息中提取多条消息,并使用拆分器元素将这些消息拆分为多条消息。但是我的拆分器抛出以下错误

2015-10-26 15:09:06,257[[ACTIVE]execute thread:' 0 ' for queue:' WebLogic . kernel . default(self-tuning)']ERROR org . spring framework . web . Context . Context loader-Context初始化失败org . spring framework . beans . factory . beancreationexception:创建名为' org . spring framework . integration . handler . messagehandler chain # 1 '的bean时出错:无法创建内部bean ' org . spring framework . integration . config . splitterfactorybean # 20e 2嵌套异常为org . spring framework . beans . factory . beancreationexception:创建名为“org . spring framework . integration . config . splitterfactorybean # 20 e2ef 61”的bean时出错:FactoryBean在对象创建时引发异常;嵌套异常为Java . lang . illegalargumentexception:发现方法匹配的参数类型[class java.lang.String]不明确:[public Java . util . list com . sales order . payment . util . poslogtoisellerequests . poslogtransformer(Java . lang . string),public Java . util . list com . sales order . payment . util . poslogtoisellerequests . split(Java . util)],位于org . spring framework . beans . factory . support . beandefinitionvalueresolver . resolveinnerbean(bean definitionvalue

分路器块:

<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;
}

}

拆分器接口只包含两个拆分方法。Spring集成中是否不允许方法重载?

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

共有1个答案

卢普松
2023-03-14

如果您没有明确地标识拆分器中的方法名,框架将检测多个方法候选项,并且不能确定调用哪个方法。

因此:

找到用于方法匹配的不明确的参数类型[class Java . lang . string]:[public Java . util . list com . sales order . payment . util . poslogtoisellerequests . poslogtransformer(Java . lang . string),public Java . util . list com . sales order . payment . util . poslogtoisellerequests . split(Java . util . list)]

除非指定< code>method="split",否则POJO方法匹配会考虑所有公共方法。

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

 类似资料:
  • 我没有正确安装吗?我忽略了什么?

  • 成功登录后,使用定义用户角色重定向,返回未定义路由的错误。 未定义InvalidArgumentException路由[列表活动]。 功能: 我的web.php文件代码 我的路由管理\web.php文件代码 这是我的控制器代码

  • 问题内容: 我创建了一个单元工厂包装器,以启用JavaFX表单元的自定义配置。请参见下面的代码。 这个cellfactory包装器通常可以在我所有的表视图中导航。但是,一旦我在系统中执行其他功能,例如添加新记录,编辑记录等,就会引发以下错误。 我似乎无法弄清楚为什么这个包装器认为我的CML类中包含空值。任何人对于为什么会抛出此Null Pointer异常有任何想法? 问题答案: 不能保证在第一次调

  • 我无法确定问题的原因,我不知道是分析器无效还是elasticsearch甚至找到了autocomplete-analyser.json文件。我该怎么解决这个?

  • "CATCH"应该严格地在"扔"之后叫吗?" 例1: 错误: 找不到方法“接收器”:没有方法缓存,也没有^在/tmp/739536251/main块中查找_方法。pl6第11行 例2: 无误

  • 这是我目前得到的。 这是我创建的过滤器