1

我正在尝试获取方法入口点解析器以将有效负载转换为基类,如所请求方法的参数所示。然而,骡子并没有这样做。我可能做错了什么?

也就是说,给定以下配置:

<mule ...>
    <spring:bean id="FooBean" class="foo.Foo" />

    <flow name="test">
        <vm:inbound-endpoint name="test.Name" path="test.Path" exchange-pattern="request-response" />

        <component>
            <method-entry-point-resolver>
                <include-entry-point method="bar" />
            </method-entry-point-resolver>
            <spring-object bean="FooBean" />
        </component>        
    </flow>
</mule>

并给出 foo.Foo:

package foo;

public class Foo {

    public Foo() {
    }

    public String bar(final Object anObject) {
        return "bar";
    }

}

我希望以下测试能够通过,但事实并非如此。也就是说,我发送到流的有效负载是 anInteger并且我希望 Mule 将其作为参数传递给Foo::bar

@Test
public void methodEntryPointResolverUpcasts() throws MuleException {
    final MuleClient client = muleContext.getClient();
    final MuleMessage reply = client.send("vm://test.Path", new Integer(1), null, RECEIVE_TIMEOUT);
    assertEquals("bar", reply.getPayload());
}

相反,日志显示错误。这是一个相关的片段:


...
Message               : Failed to find entry point for component, the following resolvers tried but failed: [
ExplicitMethodEntryPointResolver: Could not find entry point on: "foo.Foo" with arguments: "{class java.lang.Integer}"
]
...
Exception stack is:
1. Failed to find entry point for component, the following resolvers tried but failed: [
ExplicitMethodEntryPointResolver: Could not find entry point on: "foo.Foo" with arguments: "{class java.lang.Integer}"

4

1 回答 1

3

Mule 的入口点解析器本身不执行强制转换:它们寻找可能接受特定有效负载的方法。

这就是说,method-entry-point-resolver需要严格的类型匹配才能工作。在幕后,我们在支持它的类 ExplicitMethodEntryPointResolver.java 中找到以下行:

if (ClassUtils.compare(parameterTypes, classTypes, false, true))

那里的false意思是:不匹配对象。这就是匹配对您不起作用的原因。不幸的是,这是不可配置的。

当您删除入口点解析器的显式配置时,Mule 使用默认的解析器链,其中包含reflection-entry-point-resolver. 这是一个愉快地将 Integer 传递给 Object 参数的方法,因为在 ReflectionEntryPointResolver.java 中:

methods = ClassUtils.getSatisfiableMethods(component.getClass(), 
            ClassUtils.getClassTypes(payload), true, true, ignoredMethods);

第二个真正的意思是:匹配对象!

因此,如果您想在配置中指定单个入口点解析器,那reflection-entry-point-resolver是您的朋友 :)

于 2012-05-01T17:27:58.990 回答