Spring环境验证
我们正在构建一个基于Spring的应用程序,它将作为分发包交付给最终用户。用户负责正确配置任何需要配置的内容(主要是关于各种文件系统位置、文件夹访问权限等)。有一个好主意是让应用程序帮助用户了解哪些未配置,哪些配置部分无效 我们当前的方法是一个定制的Spring环境验证,spring,validation,configuration,environment,Spring,Validation,Configuration,Environment,我们正在构建一个基于Spring的应用程序,它将作为分发包交付给最终用户。用户负责正确配置任何需要配置的内容(主要是关于各种文件系统位置、文件夹访问权限等)。有一个好主意是让应用程序帮助用户了解哪些未配置,哪些配置部分无效 我们当前的方法是一个定制的ApplicationContextInitializer,它“手动”执行所有环境验证,然后在应用程序上下文中显式注册几个“低级”bean。若出现问题,初始值设定项将抛出异常,异常将在main()中的某个位置捕获,并进行解释(转换为纯英语),然后显示
ApplicationContextInitializer
,它“手动”执行所有环境验证,然后在应用程序上下文中显式注册几个“低级”bean。若出现问题,初始值设定项将抛出异常,异常将在main()
中的某个位置捕获,并进行解释(转换为纯英语),然后显示
虽然这种方法可以很好地工作,但我想知道是否有任何最佳实践可以最大限度地减少手工编写的代码并尽可能地使用Spring
这里有一个说明性的例子。应用程序需要一个文件夹用于文件上载。这意味着:
app.uploads.folder
)@ConfigurationProperties
,那么Spring将使用数据绑定器将环境
(外部属性和系统/OS通常)绑定到其属性。例如
@ConfigurationProperties(name="app.uploads")
public class FileUploadProperties {
private File folder;
// getters and setters ommitted
}
将绑定到app.uploads.folder
,并确保它是文件
。对于额外的验证,您可以在setter中手动执行,也可以在FileUploadProperties
中实现Validator
,或者在字段上使用JSR-303注释。默认情况下,app.uploads.*
中未绑定的外部属性将引发异常(例如,属性名称拼写错误或转换/格式错误)
如果您使用@EnableAutoConfigure
您不必做任何其他事情,但如果只是香草春天(启动),您还需要在@Configuration
中的某个地方说@EnableConfigurationProperties
一个额外的功能:如果您还使用,您还将获得JMX和HTTP支持(在webapp中),用于检查@ConfigurationProperties
bean的可绑定和绑定属性。HTTP端点是“/configprops”。可能重复,但有一些重叠,但这个问题提出得更好,更详细。非常感谢您的回答,Dave。此功能绝对相关,但我有点困惑,从setter(setFolder()
,基于您的示例)抛出实际上不会影响任何东西:上下文已成功初始化,应用程序运行时就好像根本没有问题一样:-(另一方面,如果没有setter,它看起来根本不起作用-value总是空的。我认为它是一个单值字段,应该调用setter。如果你想将一个示例粘贴到github项目中,我会看看是否可以解释。看不出有什么问题。你确定你在某处设置了app.uploads.folder
这不是一个文件?对于所有这些实验,其余的代码库和配置文件是完全相同的。