当前位置: 首页 > 知识库问答 >
问题:

在Apache camel中如何调用bean方法?

向锦
2023-03-14

这是我的豆子

package beans;

import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.NodeList;

public class setFileNames {
    public String getCityName(Document document) {
        NodeList cities = document.getDocumentElement().getElementsByTagName(
                "city");
        Element city = (Element) cities.item(0);
        String textContent = city.getTextContent();
            return textContent+".xml";
        }
}

这是我的路线

public void configure ( )  throws java .lang .Exception {
    from ( uril1ap .get ("Sender  cFile  1") ).routeId ( "Sender_cFile_ l").split()
    .xpath ( "/ people/ person") .id ( "cSplitter_ l")
    .setHeader ( "CamelFileName")  .method ( beans.setFileNames.class)
    .id ( "cSetHeader_ l") .to ( uril1ap .get ( "Receiver_cFile_2") )
    .id ( "cFile_2") .process ( new  org .apache .camel . Processor ( )  
            { public void  process ( org .apache .carnel .Exchange  exchange)
    throws  Exception  {
    System .out .println ( "File rece ived : "
                                        + exchange .getIn ().getHeader ( "CamelFileName") ) ;
    }) .id ( "cProcessor_ l");

您可能会在上面的路由中找到一些语法问题,但它工作正常(此处复制的代码不准确)

想知道,我们可以看到CamelFileNamebean正在路由中使用,这是类setFileNames的一个实例,但是它是如何在路由中调用getCityName方法的呢?路由是如何知道调用和打印哪个方法的?

共有2个答案

葛越
2023-03-14

据我所知,Camel调用类中的公共方法,在这种情况下,它还推断其参数文档作为消息正文,因为没有注释(例如@head er、@Ex那他属性等)绑定到参数。

但是,如果bean类有多个公共方法,那么Camel会尝试调用参数与消息体类型匹配的公共方法。通过查找具有相同类型的参数的多个公共方法,它会由于歧义问题引发运行时异常。

正如@burki所提到的,您可以指明要在路由中调用的方法。但您也可以通过使用@Handler注释bean类中的一个方法,将其标记为默认方法。

鲁涵意
2023-03-14

正是这句话调用了豆子:

<代码>。方法(beans . set filenames . class)

虽然在您的情况下参数有点奇怪,但是您有各种选项可以传递给< code>method语句。

最常见的有

    < li >一个类<代码>。方法(MyBean.class) < Li > bean实例< code >。在Route类中创建的方法(myBean) < li >按名称<代码>。方法(" myBean")如果Bean是在应用程序上下文中注册的

在您的情况下,方法选择非常简单,因为只有一种方法。

但是,Camel有一个相当“精细”的算法来选择Bean类中最合适的方法。

如果此算法选择了错误的方法,则可以通过名称显式调用该方法:.method(MyBean.class,“myMethod”)

 类似资料:
  • 我从基于apache-camel-spark的rest接口获得一个json数组作为输入。开始时,我想通过apache camels路线分割json-array来处理每个元素。我该怎么做? 我的测试输入json: 对于这个问题,我在stackoverflow上找到了一些间接描述的问题: link 1, link 2, link 3。 根据这些示例,我尝试了以下骆驼路线: 当我这样做时,我总是得到以下

  • 问题内容: 注意:这旨在作为常见问题的规范答案。 我有一个带有字段()的Spring 类(),但是该字段是我尝试使用它时所用的。日志显示同时创建了bean和bean,但是每当尝试在服务bean上调用方法时,我都会得到一个。Spring为什么不自动接线该领域? 控制器类: 服务等级: 应该自动连接的服务bean,但不是: 当我尝试时,出现以下异常: 问题答案: 带注释的字段是因为Spring不知道您

  • 问题内容: 我有一个用例,需要在ApplicationContext加载一次时在Bean中调用一次(非静态)方法。如果我为此使用MethodInvokingFactoryBean可以吗?还是我们有更好的解决方案? 附带说明一下,我使用ConfigContextLoaderListener在Web应用程序中加载应用程序上下文。并且想要,如果实例化了bean’A’,则只需调用一次methodA()。

  • 我们计划将托管bean更改为CDIBeans。我们使用下面的代码来调用托管Bean中的服务类。 对于CDI bean,我将@ManagedProperty替换为@注入,如下所示,它正在引发以下异常。 } UserService是一个带有未实现方法的普通接口,UserServiceImpl实现了UserService接口。请看下面: 请让我知道如何在CDI bean中调用服务接口?

  • 我很好奇spring注入是如何用注释处理调用方法的。如果我将注释放在一个方法上,并返回一个实例,我理解这会告诉spring通过调用该方法并获得返回的实例来创建一个bean。但是,有时该bean必须用于连接其他bean或设置其他代码。通常的方法是调用带注释的方法来获得一个实例。我的问题是,为什么这不会导致bean的多个实例浮动? 例如,参见下面的代码(摘自另一个问题)。方法是用注释的,因此我想spr