Spring integration spring集成:将头值记录到数据库的自定义头enricher

Spring integration spring集成:将头值记录到数据库的自定义头enricher,spring-integration,Spring Integration,我希望有一个自定义的头enricher,它接受要添加的头值,并将它们添加到头中,还将它们记录在数据库中。我试图创建一个定制的spring标记,比如:db recording header enricher,并在我感兴趣的地方使用它来代替header enricher标记,将头记录到数据库中 以下是我目前掌握的情况: 我有定制的SpringXML名称空间,并且正确配置了定制元素db记录器头enricher。我有一个测试spring集成xml,用于测试解析器是否正常工作。测试正在正确加载测试XML,

我希望有一个自定义的头enricher,它接受要添加的头值,并将它们添加到头中,还将它们记录在数据库中。我试图创建一个定制的spring标记,比如:db recording header enricher,并在我感兴趣的地方使用它来代替header enricher标记,将头记录到数据库中

以下是我目前掌握的情况:

我有定制的SpringXML名称空间,并且正确配置了定制元素db记录器头enricher。我有一个测试spring集成xml,用于测试解析器是否正常工作。测试正在正确加载测试XML,除了我想使用下面的自定义解析器,而不是它默认选择作为转换器的头文件

db录制标头enricher的处理器如下所示:

DbRecorderHeaderEnricherParser implements BeanDefinitionParser {
   @Override
   public BeanDefinition parse(Element element, ParserContext parserContext) {
       BeanDefinition beanDefinition = new StandardHeaderEnricherParser().parse(element, parserContext);
       // Set the header Enricher processor to be my custom processor
       // beanDefinition.setHeaderEnricherProcessor(dbRecordingHeaderEnricher);
       return beanDefinition;
    }
}
我面临的问题是:

根据上面的解析器定义,如果我使用StandardHeaderEnricherParser来解析xml,我无法找到一种方法将DbRecordingHeaderEnricher关联为头enricher解析的转换器。即使我扩展了StandardHeaderEnricherParser,下面的方法也是最终的,所以我似乎也不能为它提供用于转换的自定义解析器

@Override
protected final String getTransformerClassName() {
    return HeaderEnricher.class.getName();
}

在我的自定义解析器中,我要做的就是将我的自定义头enricher(它扩展了HeaderEnricher类)与头的解析关联起来,并为添加的头在数据库中创建记录。如果按照我的想法,这是不可能的,那么还有其他的选择吗?我可以在变压器上使用AOP/advice吗?

这是相当先进的。您将需要一个模式,一个将解析器与名称空间元素和解析器本身相关联的名称空间处理程序

使用
并简单地引用添加标题(并存储标题)的bean可能更简单

如果您想学习如何编写自己的名称空间;一个开始的好地方是将为您创建所有的锅炉板

编辑:

作为对您的更新的响应

因为它仍然是一个bean定义,而不是一个bean,所以您可以简单地更改
beanClassName
属性

BeanDefinition beanDefinition = new StandardHeaderEnricherParser().parse(element, parserContext);
beanDefinition.setBeanClassName(Foo.class.getName());

这是相当先进的。您将需要一个模式,一个将解析器与名称空间元素和解析器本身相关联的名称空间处理程序

使用
并简单地引用添加标题(并存储标题)的bean可能更简单

如果您想学习如何编写自己的名称空间;一个开始的好地方是将为您创建所有的锅炉板

编辑:

作为对您的更新的响应

因为它仍然是一个bean定义,而不是一个bean,所以您可以简单地更改
beanClassName
属性

BeanDefinition beanDefinition = new StandardHeaderEnricherParser().parse(element, parserContext);
beanDefinition.setBeanClassName(Foo.class.getName());

恐怕我没有就我面临的问题提供足够的细节。我已经更新了问题。希望这能让我对我所面临的问题有更多的了解!恐怕我没有就我面临的问题提供足够的细节。我已经更新了问题。希望这能让我对我所面临的问题有更多的了解!