1

问题也可能与我对这个概念的理解有关。
ActionClass正在调用代理 bean,即AccountingInterface. 代理bean接口是用AccountingUtil类实现的。所以我期待xml返回的AccountingUtil通过seda:accountingQueue,然后在控制台上流出。
应用程序上下文

    <bean id="accountingInterface" class="org.apache.camel.spring.remoting.CamelProxyFactoryBean">
      <property name="serviceUrl" value="seda:accountingQueue"/>
      <property name="serviceInterface" value="acord.transaction.util.AccountingInterface"/>
    </bean>
    <route>
        <from uri="seda:accountingQueue"/>
        <setHeader headerName="nowInMillis">
           <groovy>new Date().getTime()</groovy>
         </setHeader>
         <to uri="stream:out"/>
    </route>

会计接口

public interface AccountingInterface 
{
    void send(String xml);
    String accountingUpdate(EDITDate accountingProcessDate);
}

会计工具

public class AccountingUtil implements AccountingInterface
{
  public String accountingUpdate(EDITDate accountingProcessDate)
     {
       //doSomething
      return xml;
    }

动作类

AccountingInterface accountingInterface = (AccountingInterface) AppContext.getBean("accountingInterface");
accountingInterface.accountingUpdate(accountingProcessDate);

但我得到了例外:

No body available of type: java.lang.String but has value: BeanInvocation public abstract java.lang.String acord.transaction.util.AccountingInterface.accountingUpdate(edit.common.EDITDate) with [2012/11/08]] of type: org.apache.camel.component.bean.BeanInvocation on: Message: BeanInvocation public abstract java.lang.String acord.transaction.util.AccountingInterface.accountingUpdate(edit.common.EDITDate) with [2012/11/08]]. Caused by: No type converter available to convert from type: org.apache.camel.component.bean.BeanInvocation to the required type: java.lang.String with value BeanInvocation public abstract java.lang.String acord.transaction.util.AccountingInterface.accountingUpdate(edit.common.EDITDate) with [2012/11/08]]. Exchange[Message: BeanInvocation public abstract java.lang.String acord.transaction.util.AccountingInterface.accountingUpdate(edit.common.EDITDate) with [2012/11/08]]]. Caused by: [org.apache.camel.NoTypeConversionAvailableException - No type converter available to convert from type: org.apache.camel.component.bean.BeanInvocation to the required type: java.lang.String with value BeanInvocation public abstract java.lang.String acord.transaction.util.AccountingInterface.accountingUpdate(edit.common.EDITDate) with [2012/11/08]]]
    at org.apache.camel.impl.MessageSupport.getMandatoryBody(MessageSupport.java:101)

还有一个问题我可以有多个serviceURLproxyBean(interface)吗?
我想要不同的方法来调用不同serviceURL但属于单个接口的一部分。

4

1 回答 1

0

更新: 啊,刚刚明白你的问题。一开始就有点第一了。

在进行代理时,Camel 将调用(到哪个方法/接口和哪些参数)转换为一个 BeanInvocation 对象。然后通过选择的 Camel 端点(在您的情况下为 seda)进行处理。但是您正在尝试将其打印到标准输出而不是调用 bean 实例AccountingInterface(例如AccountingUpdateACORDUtil在您的情况下)。

不,不同的方法将调用相同的 URL,但使用 .. .. 中的不同方法BeanInvocation。这当然可以通过在 Camel 路由中路由您的请求来实现,例如首先将其发送到一个简单的direct:routeAccoutingRequest然后查看调用的方法以确定它应该在选择构造中转到哪个端点。

您可以使用带有 ProducerTemplates 的普通对象构建自己的逻辑,以实现诸如发送字符串、调用不同方法等的事情。代理用于代理 bean 调用。

于 2013-06-24T22:23:05.877 回答