【问题标题】:WSO2 ESB error on deploying custom mediator部署自定义调解器时出现 WSO2 ESB 错误
【发布时间】:2017-09-21 15:40:48
【问题描述】:

我正在尝试在 wso2 ESB 4.8 中实现自定义中介。 我使用this article 作为参考,也参考the docs,但无法让 ESB 识别我的中介者的 xml 配置。

我按照文档中提到的所有步骤,将调解器的项目 .jar 移动到 <ESB_HOME>/ repository/components/lib 并重新启动服务器,但我在部署过程中不断收到以下错误:

ERROR - MediatorFactoryFinder Unknown mediator referenced by configuration element : {http://ws.apache.org/ns/synapse}currencyMediator 

下面是中介代码:

package org.wso2.esb.tutorial.custom;

import java.util.Iterator;

import javax.xml.namespace.QName;

import org.apache.axiom.om.OMElement;
import org.apache.axiom.om.OMNode;
import org.apache.axiom.soap.SOAPBody;
import org.apache.synapse.MessageContext;
import org.apache.synapse.mediators.AbstractMediator;


public class CurrencyMedXML extends AbstractMediator { 
    private String symbol = "$";

    public boolean mediate(MessageContext synCtx) { 

        // get symbol, last elements of SOAP envelope
        SOAPBody body = synCtx.getEnvelope().getBody();
        OMElement firstElement = body.getFirstElement();

        //Iterator it = firstElement.getChildren();
        Iterator it = firstElement.getChildrenWithName(new QName( "return"));
        while (it.hasNext()) {
            OMNode node = (OMNode)it.next();
            if (node.getType()==OMNode.ELEMENT_NODE) {
                OMElement ele=(OMElement)node;
                String text = ele.getText();
                ele.setText(symbol+text);
            }
        }


        return true;
    }

    public void setSymbol(String sym){
        symbol=sym;
    }

    public String getSymbol(){
        return symbol;
    }
}

序列化器实现:

package org.wso2.esb.tutorial.custom;

import org.apache.axiom.om.OMElement;
import org.apache.synapse.Mediator;
import org.apache.synapse.config.xml.AbstractMediatorSerializer;

public class CurrencyMedXMLSerializer extends AbstractMediatorSerializer {

    public String getMediatorClassName() {
        return CurrencyMedXML.class.getName();
    }

    @Override
    protected OMElement serializeSpecificMediator(Mediator m) {
        if (!(m instanceof CurrencyMedXML)) {
              handleException("Unsupported mediator passed in for serialization : "
                  + m.getType());
        }

        CurrencyMedXML mediator = (CurrencyMedXML) m;
        OMElement CurrencyMediatorElement = fac
            .createOMElement(CurrencyMedXMLFactory.CURRENCY_MEDIATOR_Q);

        saveTracingState(CurrencyMediatorElement, mediator);

        OMElement symbolElement = fac.createOMElement(CurrencyMedXMLFactory.SYMBOL_Q, CurrencyMediatorElement);
        symbolElement.setText(mediator.getSymbol());

        return CurrencyMediatorElement;
    }
}

以及工厂实现:

package org.wso2.esb.tutorial.custom;

import java.util.Properties;

import javax.xml.namespace.QName;

import org.apache.axiom.om.OMElement;
import org.apache.synapse.Mediator;
import org.apache.synapse.SynapseException;
import org.apache.synapse.config.xml.AbstractMediatorFactory;
import org.apache.synapse.config.xml.XMLConfigConstants;

public class CurrencyMedXMLFactory extends AbstractMediatorFactory {

      static final QName CURRENCY_MEDIATOR_Q = new QName(
          XMLConfigConstants.SYNAPSE_NAMESPACE, "currencyMediator");

      static final QName SYMBOL_Q = new QName(
          XMLConfigConstants.SYNAPSE_NAMESPACE, "symbol");

      public QName getTagQName() {
        return CURRENCY_MEDIATOR_Q;
      }

    @Override
    protected Mediator createSpecificMediator(OMElement elem, Properties properties) {
        // create new mediator
          CurrencyMedXML newMediator = new CurrencyMedXML();

        // setup initial settings 
          processAuditStatus(newMediator, elem);

          OMElement symbolElement = elem.getFirstChildWithName(SYMBOL_Q);
          if (symbolElement != null) {
              String symbol = symbolElement.getText();
              newMediator.setSymbol(symbol);
          } else {
              throw new SynapseException("default percentage element missing");
          }

        return newMediator; 
    }
}

这是来自代理服务的 sn-p,我在其中引用了自定义中介:

<outSequence>
  <currencyMediator>
    <symbol>$</symbol>
  </currencyMediator>
  <send/>
</outSequence>

【问题讨论】:

    标签: java wso2 wso2esb


    【解决方案1】:

    我还没有尝试过自定义标记方法。但仅供参考,您也可以像这样致电您的班级调解员。

    <class name="samples.mediators.DiscountQuoteMediator">
        <property name="discountFactor" value="10"/>
        <property name="bonusFor" value="5"/>
    </class>
    

    【讨论】:

      【解决方案2】:

      我在使用 WSO2 Dev Studio 创建自定义中介时遇到了同样的问题。更多信息可以在here找到。

      为了解决这个问题,我不得不从命令行使用 maven 构建调解器。

      希望对您有所帮助。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2016-01-01
        • 2012-10-05
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2023-03-24
        • 1970-01-01
        相关资源
        最近更新 更多