在 Spring 引导中,如何注册解析应用程序配置时可用的自定义转换器?



在 Spring 引导应用程序中,如何注册要在处理应用程序配置时使用的自定义转换?

我做了一个自定义转换(org.springframework.core.convert.converter.Converter(,所以它可以被ApplicationConversionService/Binder用来解析application.properties和application.yaml配置文件中定义的@ConfiguraitonProperties,但不知道如何注册它。

我已经在这里尝试了解决方案 https://stackoverflow.com/a/41205653/45708 但它在处理了应用程序配置参数后创建了转换器的实例。

我最近自己遇到了这个问题。 据我所知,关键问题是与配置属性的绑定发生在 Spring 启动过程的早期,在应用程序上下文完全初始化之前。 因此,注册转换器的常用方法并不可靠。 事实上,用于配置绑定的转换服务似乎是一次性的,并没有真正连接到存储在应用程序上下文中的转换服务。

我能够得到一些工作,但它感觉像一个黑客,因为它依赖于内部实现细节,这些细节今天可能有效,但明天就不行了。 无论如何,这是我使用的代码:

((ApplicationConversionService) ApplicationConversionService.getSharedInstance()).addConverter(myCustomConverter);

我发现的技巧是确保在应用程序启动时尽快调用它,以便在需要它的配置绑定之前调用它。 我把它放在我的主要@SpringBootApplication类的一个@PostConstruct块中,因为这似乎很早就被调用了,至少在我的情况下是这样。

我发现这是一个非常令人困惑的问题,尤其是对于刚接触 Spring 的人来说。我的解决方案是创建一个替代构造函数,使用基元参数,并用@ConstructorBinding对其进行批注,以指示要用于 Binder 的构造函数。

最新更新