Spring环境验证

Spring环境验证,spring,validation,configuration,environment,Spring,Validation,Configuration,Environment,我们正在构建一个基于Spring的应用程序,它将作为分发包交付给最终用户。用户负责正确配置任何需要配置的内容(主要是关于各种文件系统位置、文件夹访问权限等)。有一个好主意是让应用程序帮助用户了解哪些未配置,哪些配置部分无效 我们当前的方法是一个定制的ApplicationContextInitializer,它“手动”执行所有环境验证,然后在应用程序上下文中显式注册几个“低级”bean。若出现问题,初始值设定项将抛出异常,异常将在main()中的某个位置捕获,并进行解释(转换为纯英语),然后显示

我们正在构建一个基于Spring的应用程序,它将作为分发包交付给最终用户。用户负责正确配置任何需要配置的内容(主要是关于各种文件系统位置、文件夹访问权限等)。有一个好主意是让应用程序帮助用户了解哪些未配置,哪些配置部分无效

我们当前的方法是一个定制的
ApplicationContextInitializer
,它“手动”执行所有环境验证,然后在应用程序上下文中显式注册几个“低级”bean。若出现问题,初始值设定项将抛出异常,异常将在
main()
中的某个位置捕获,并进行解释(转换为纯英语),然后显示

虽然这种方法可以很好地工作,但我想知道是否有任何最佳实践可以最大限度地减少手工编写的代码并尽可能地使用Spring

这里有一个说明性的例子。应用程序需要一个文件夹用于文件上载。这意味着:

  • 应该有一个配置文件
  • 应用程序应该可以访问此文件
  • 此文件不应有语法错误
  • 此文件应明确定义某些特定属性(设为
    app.uploads.folder
  • 此属性应该描述现有的文件系统实体
  • 此实体应为文件夹
  • 应用程序应具有对此文件夹的读/写访问权限
  • Spring是否提供了任何工具来轻松实现这种验证?

    有一个很好的上下文和外部配置验证功能。如果定义一个POJO类并将其声明为
    @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
    这不是一个文件?对于所有这些实验,其余的代码库和配置文件是完全相同的。