【问题标题】:Mulesoft Java TransformerMulesoft Java 转换器
【发布时间】:2017-05-26 16:37:06
【问题描述】:

我不知道如何在 Mulesoft 中使用 Java 转换器。我想基本上取一个字符串并将其转换为一个 URL,但我不知道如何使用 Java 方法或任何东西。

我做错了什么?我怎样才能调用我的方法,或者让我的方法与我想要的值一起使用?

错误:

org.mule.module.launcher.DeploymentInitException: IllegalStateException:无法转换类型的值 [transformers.StringTransformer] 到所需类型 [org.mule.api.processor.MessageProcessor] 用于属性 'messageProcessors[4]': 没有匹配的编辑器或转换策略 找到了

原因:org.mule.api.config.ConfigurationException:创建错误 名称为“streamMigrateAccountToCustomer”的 bean:初始化 豆失败;嵌套异常是 org.springframework.beans.ConversionNotSupportedException:失败 将类型 [java.util.ArrayList] 的属性值转换为所需类型 [java.util.List] 用于属性“消息处理器”;嵌套异常是 java.lang.IllegalStateException:无法转换类型的值 [transformers.StringTransformer] 到所需类型 [org.mule.api.processor.MessageProcessor] 用于属性 'messageProcessors[4]': 没有匹配的编辑器或转换策略 找到(org.mule.api.lifecycle.InitialisationException) (org.mule.api.config.ConfigurationException)

字符串转换器

@ContainsTransformerMethods
public class StringTransformer
{
    public String website;

  public String getWebsite() {
      return website;
  }

  public void setWebsite(String website) {
      this.website = website;
  }

@Transformer
  public String stringToURL(String string) throws MalformedURLException
  {
      return new java.net.URL(string).toString();
  }
}

XML

<custom-transformer class="transformers.StringTransformer" doc:name="Java">
    <spring:property name="website" value="#[payload.Website]"/>
</custom-transformer>

输入到 JAVA 转换器

%dw 1.0
%output application/java
---
{
    Id: payload.Id,
    Name: payload.Name,
    Active_CMRR__c: payload.Active_CMRR__c,
    BillingStreet: payload.BillingStreet,
    BillingCity: payload.BillingCity,
    BillingState: payload.BillingState,
    BillingPostalCode: payload.BillingPostalCode,
    BillingCountry: payload.BillingCountry,
    OwnerId: payload.OwnerId,
    Website: payload.Website,
    Contract_End_Date__c: payload.Contract_End_Date__c,
    NS_Account_Number__c: payload.NS_Account_Number__c,
    Phone: payload.Phone,
    Subscription_Start_Date__c: payload.Subscription_Start_Date__c,
    NS_Account_Name__c: payload.NS_Account_Name__c,
    type: payload.type,
    Owner: {
        NS_Account_Manager_Id__c: payload.Owner.NS_Account_Manager_Id__c,
        Id: payload.Owner.Id,
        type: payload.Owner.type,
        Name: payload.Owner.Name
    }
}

【问题讨论】:

    标签: java spring


    【解决方案1】:

    对于简单的字符串操作,我更喜欢使用简单的 MEL 表达式,下面是创建新变量的示例。

    <set-variable variableName="website" value="#[new java.net.URL(payload.Website).toString()]" doc:name="Variable"/>
    

    要在 MuleMessage 上执行 java transformations,我更喜欢扩展 AbstractMessageTransformer 类。

    public class ExampleAbstractMessageTransformer extends AbstractMessageTransformer {
    
    @Override
    public Object transformMessage(MuleMessage message, String outputEncoding) throws TransformerException  {
        // TODO Auto-generated method stub
        HashMap<String, String> payload = new HashMap<String, String>();
        String websiteUrl = new String();
    
        //Grab Payload
        payload = (HashMap<String, String>) message.getPayload();
        try {
            websiteUrl = stringToURL(payload.get("Website").toString());
        } catch (MalformedURLException e) {
            e.printStackTrace();
        }
    
    
        message.setInvocationProperty("websiteUrl", websiteUrl);
        return message;
    }
    
    public String stringToURL(String string) throws MalformedURLException {
        return new java.net.URL(string).toString();
    }
    }
    

    在 Mulesoft 流程中实施。假设 java 代码被打包为 com.stackoverflow.transformers 使用“custom-transformer”组件。

    <custom-transformer class="com.stackoverflow.transformers.ExampleAbstractMessageTransformer" doc:name="Java" />
    

    【讨论】:

      【解决方案2】:

      你可以使用invoke组件来调用java方法。检查https://docs.mulesoft.com/mule-user-guide/v/3.7/invoke-component-reference

      【讨论】:

      • 请在答案中说明如何做到这一点。
      【解决方案3】:
      @ContainsTransformerMethods // since Mule 3.0.1 
          public class MyTransformers {  
          @Transformer  
          public URL stringToURL(String string) {  
             return new java.net.URL(string); 
          }
          @Transformer 
          public List<URL> stringsToURLs(String string) {    
             List<URL urls = new ArrayList<URL>();   
             for (StringTokenizer tokenizer = new StringTokenizer(string); tokenizer.hasMoreTokens();) {       
                urls.add(new URL(tokenizer.nextToken()));
             }   
             return urls;
          }
       }
      

      【讨论】:

      • 试着解释你的答案。不要只给出代码作为答案
      猜你喜欢
      • 1970-01-01
      • 2016-05-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-12-23
      相关资源
      最近更新 更多