我希望有一个自定义的标头扩充器,它可以添加标头值并将它们添加到标头中,并将它们记录在数据库中。我试图创建一个自定义弹簧标签说: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关联为转换器来解析标头扩充器。即使我扩展了StandardHeaderEnricherParser,下面的方法也是最终的,所以我似乎无法将其自定义解析器用于转换目的。
@Override
protected final String getTransformerClassName() {
return HeaderEnricher.class.getName();
}
我想在我的自定义解析器中做的就是关联我的自定义头文件richher(它扩展了HeaderEnricher类),用于解析头文件,并为添加的头文件创建记录到数据库中。如果我不可能按照这种方式思考它,那么还有哪些其他选择呢?我可以在变压器上使用AOP /建议吗?
答案 0 :(得分:1)
这是相当先进的。您将需要一个模式,一个名称空间处理程序,它将解析器与名称空间元素和解析器本身相关联。
使用<transformer/>
可能更简单,只需引用添加标题的bean(并存储它们)。
如果您想学习如何编写自己的命名空间;一个开始的好地方是STS project templates,它将为您创建所有的锅炉板。
编辑:
回应您的更新......
由于它仍然是一个bean定义,而且还不是bean,你只需更改beanClassName
属性......
BeanDefinition beanDefinition = new StandardHeaderEnricherParser().parse(element, parserContext);
beanDefinition.setBeanClassName(Foo.class.getName());