2017-02-14 39 views
0

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

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

ERRORS:

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

所致:org.mule.api.config.ConfigurationException:错误创建 名称为'streamMigrateAccountToCustomer'的bean:初始化为 bean失败;嵌套异常是 org.springframework.beans.ConversionNotSupportedException:无法将 转换为属性'messageProcessors'的类型为[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)

StringTransformer

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

回答

3

对于一个简单的字符串操作我更喜欢使用一个简单的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" /> 
0
@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; 
    } 
} 
+0

试着解释你的答案。不要只把代码作为答案 –