代码之家  ›  专栏  ›  技术社区  ›  Rick

MuleSoft/Java-错误:无法解析方法

  •  0
  • Rick  · 技术社区  · 7 年前

    我一直在和Mule一起做一个简单的项目。目标是从url中提取两个数字,并使用它们创建一个范围,然后检查它们是否是3、7或两者的倍数,然后依次打印出来。要遵循的流程代码:

    <?xml version="1.0" encoding="UTF-8"?>
    
    <mule xmlns:scripting="http://www.mulesoft.org/schema/mule/scripting" xmlns:dw="http://www.mulesoft.org/schema/mule/ee/dw" xmlns:json="http://www.mulesoft.org/schema/mule/json" xmlns="http://www.mulesoft.org/schema/mule/core" xmlns:doc="http://www.mulesoft.org/schema/mule/documentation"
        xmlns:spring="http://www.springframework.org/schema/beans" 
        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-current.xsd
    http://www.mulesoft.org/schema/mule/core http://www.mulesoft.org/schema/mule/core/current/mule.xsd
    http://www.mulesoft.org/schema/mule/json http://www.mulesoft.org/schema/mule/json/current/mule-json.xsd
    http://www.mulesoft.org/schema/mule/ee/dw http://www.mulesoft.org/schema/mule/ee/dw/current/dw.xsd
    http://www.mulesoft.org/schema/mule/scripting http://www.mulesoft.org/schema/mule/scripting/current/mule-scripting.xsd">
        <configuration doc:name="Configuration">
            <expression-language>
                <import class="sandbox.FindingMultiples" />
                <global-functions>
                    def multiples(f,c)
                    {
                         return sandbox.FindingMultiples.multiplesInRange(f,c);
                    }
                </global-functions>
            </expression-language>
        </configuration>
        <flow name="multiples-implFlow">
            <logger level="INFO" doc:name="Log Start of Flow" message="multiples-implFlow: Starting flow..."/>
            <set-variable variableName="floor" value="#[message.inboundProperties.'http.uri.params'.floor]" doc:name="Set Floor Variable"/>
            <set-variable variableName="ceiling" value="#[message.inboundProperties.'http.uri.params'.ceiling]" doc:name="Set Ceiling Variable"/>
            <logger level="INFO" doc:name="Log Flow Variables" message="Floor: #[flowVars.floor] Ceiling: #[flowVars.ceiling]"/>
            <logger message="Starting transformation..." level="INFO" doc:name="Log Start of Transform"/>
            <dw:transform-message doc:name="Transform Message">
                <dw:set-payload><![CDATA[%dw 1.0
    %output application/java
    ---
    {
        output: multiples((flowVars.floor), (flowVars.ceiling))
    }]]></dw:set-payload>
            </dw:transform-message>
            <logger message="Completing transformation. Payload: #[payload]" level="INFO" doc:name="Log Payload"/>
            <json:object-to-json-transformer doc:name="Object to JSON"/>
            <logger message="Post Object to Json. Payload: #[payload]" level="INFO" doc:name="Log Payload"/>
            <logger level="INFO" doc:name="Log End of Flow" message="multiples-implFlow: Completing Flow..."/>
        </flow>
    </mule>
    

    我使用自己编写的自定义Java类来处理逻辑:

    package sandbox;
    
    import java.util.*;
    import java.util.stream.IntStream;
    
    public class FindingMultiples {
    
        public List<String> multiplesInRange(int floor, int ceiling)
        {
            int[] range = IntStream.rangeClosed(floor, ceiling).toArray();
            List<String> result = new ArrayList<>();
    
            for(int i = 0; i < range.length; i++)
            {
                if(range[i] % 3 == 0)
                {
                    result.add(range[i] + " : " +  "ME");
                    i++;
                }else if(range[i] % 7 == 0)
                {
                    result.add(range[i] + " : " +  "MAY");
                    i++;
                }else if(range[i] % 3 == 0 && range[i] % 7 == 0)
                {
                    result.add(range[i] + " : " + "MAY and ME");
                    i++;
                }else
                {
                    i++;
                }
            }
    
            return result;
    
        }
    
    }
    

    软件包构建得很好,但当我尝试与邮递员通话时,出现以下错误:

    Message               : [Error: unable to resolve method: sandbox.FindingMultiples.multiplesInRange(java.lang.String, java.lang.String) [arglength=2]]
    [Near : {... def multiples(f,c) ....}]
                 ^
    [Line: 1, Column: 1] (org.mule.mvel2.PropertyAccessException).
    Payload               : {NullPayload}
    Payload Type          : org.mule.transport.NullPayload
    Element               : /multiples-implFlow/processors/5 @ sandbox:multiples-impl.xml:28 (Transform Message)
    Element XML           : <dw:transform-message doc:name="Transform Message">
                            <dw:set-payload>%dw 1.0
    %output application/java
    ---
    {
        output: multiples((flowVars.floor), (flowVars.ceiling))
    }</dw:set-payload>
                            </dw:transform-message>
    --------------------------------------------------------------------------------
    Root Exception stack trace:
    [Error: unable to resolve method: sandbox.FindingMultiples.multiplesInRange(java.lang.String, java.lang.String) [arglength=2]]
    [Near : {... def multiples(f,c) ....}]
                 ^
    [Line: 1, Column: 1]
    

    以及堆栈跟踪,我可以根据要求提供完整的堆栈跟踪。我不确定如何解决此错误。有什么帮助吗?

    1 回复  |  直到 7 年前
        1
  •  0
  •   Mahesh_Loya    7 年前

    看来 <import class=**/> 配置中的语句无法正确导入所需的类。

    我通过在全局函数定义中编写导入语句解决了这个问题

    你需要

    • 导入具有所需函数定义的java类。
    • 然后创建一个新对象并分配给某个变量
    • 使用“”调用所需的方法带此变量的点运算符。

    请尝试使用以下示例代码段更新您的配置

    <configuration doc:name="Configuration">
            <expression-language>
                <global-functions>
                    def multiples(f,c)
                    {
                        import sandbox.FindingMultiples;
                        fm=new FindingMultiples();
                         return fm.multiplesInRange(f,c);
                    }
                </global-functions>
            </expression-language>
    </configuration>