1

我想要一个自定义的标题丰富器,它需要添加标题值并将它们添加到标题中,并将它们记录在数据库中。我试图创建一个自定义弹簧标签说: db-recording-header-enricher 并在我有兴趣将标题记录到数据库的任何地方使用它而不是 header-enricher 标签。

这是我到目前为止所拥有的:

我有自定义 spring XML 名称空间,其中自定义元素 db-recorder-header-enricher 已正确配置。我有一个测试 spring 集成 xml,我用它来测试解析器是否正常运行。测试正在正确加载测试 XML,除了我想使用下面的自定义解析器而不是默认情况下作为转换器拾取的 HeaderEnricher。

db-recording-header-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 关联为用于解析 header- enricher 的转换器的方法。即使我扩展了 StandardHeaderEnricherParser,下面的方法也是最终的,所以我似乎不能再给它我的自定义解析器来进行转换。

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

我想要在我的自定义解析器中做的就是关联我的自定义标题丰富器(它扩展 HeaderEnricher 类)以解析标题并在数据库中为添加的标题创建记录。如果按照我的想法不可能,还有哪些其他选择?我可以在变压器上使用 AOP/advice 吗?

4

1 回答 1

1

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

使用 a<transformer/>并简单地引用添加标头(并存储它们)的 bean 可能更简单。

如果你想学习如何编写自己的命名空间;STS 项目模板是一个很好的起点,它将为您创建所有样板。

编辑:

响应您的更新...

由于它仍然是一个 bean 定义,而不是一个 bean,您可以简单地更改beanClassName属性...

BeanDefinition beanDefinition = new StandardHeaderEnricherParser().parse(element, parserContext);
beanDefinition.setBeanClassName(Foo.class.getName());
于 2013-08-05T23:51:14.487 回答