当前位置: 首页 > 知识库问答 >
问题:

Spring环境中的多个@ConfigurationProperties验证程序bean

俞新翰
2023-03-14

当使用@ConfigurationProperties注释将属性注入bean时,Spring提供了定义自定义验证器来验证这些属性的能力。

Con适配属性绑定后处理器使用固定的bean名称配置属性验证器和类org.springframework.validation.验证器查找此验证器。

现在假设我有一个@ConfigurationProperties,它的验证器位于模块a中。另一个模块B依赖于模块a。模块B还定义了它自己的@ConfigurationProperties和它自己的验证器。

应用程序加载时,后处理器只拾取其中一个bean。这将禁用验证的其他部分。

有解决办法吗?如何在应用程序中启用两个配置属性验证器?

共有1个答案

危晨
2023-03-14

我刚刚遇到了同样的问题,并意识到ConfigurationPropertiesBindingPostProcessor验证用@ConfigurationProperties注释的类是否实现了验证器接口本身。(请参见org.springframework.boot.context.properties.ConfigurationPropertiesBindingPostProcessor#determineValidator

因此,解决方案是将所有属性验证移动到带注释的属性类:

import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.stereotype.Component;
import org.springframework.validation.Errors;
import org.springframework.validation.ValidationUtils;
import org.springframework.validation.Validator;

@ConfigurationProperties("test.properties")
@Component
public class TestProperties implements Validator {

    private String myProp;

    public String getMyProp()
    {
        return myProp;
    }

    public void setMyProp( String myProp )
    {
        this.myProp = myProp;
    }

    public boolean supports( Class<?> clazz )
    {
        return clazz == TestProperties.class;
    }

    public void validate( Object target, Errors errors )
    {
        ValidationUtils.rejectIfEmpty( errors, "myProp", "myProp.empty" );

        TestProperties properties = (TestProperties) target;

        if ( !"validThing".equals( properties.getMyProp() ) ) {
            errors.rejectValue( "myProp", "Not a valid thing" );
        } 
    }
}
 类似资料:
  • 我希望我的web应用程序的用户通过LDAP和额外的自定义身份验证进行身份验证。这是一个用Kotlin编写的Spring Boot应用程序。我将AuthenticationManagerBuilder配置为 我希望链接身份验证,以便如果CustomAuthenticationProvider成功地进行身份验证(函数authenticate不抛出),身份验证将继续使用LDAP身份验证提供程序。 正如所

  • RabbitMQ保证在相同的发布通道- 1.)我有一个单一的线程发布消息在一个单一的交换2.(我有其他线程的集合发布消息在不同的交流有时创造新的消费者为不同的交流 使用缓存连接工厂,它具有通道缓存。每次发布时,它都会进入缓存以获取通道。因为其他线程正在发布和使用,所以不能保证同一通道将被我的主线程用于后续发布。即使我有一个缓存,这也是真的。有人回避过这个问题吗? 理想情况下,我希望为publish

  • 我的问题是,我希望有两个身份验证提供商 之前:我有我的UserDetailServiceImpl,我根据数据库中的数据验证了用户的身份(不确定是哪个提供者) 现在:我使用了ActiveDirectoryLdapAuthentiation提供程序,如下所示 我成功了,所以我可以认证。 问题是: 我现在无法再使用数据库用户登录,现在只有LDAP。 未使用UserDetailsService,因此用户具

  • 我需要一个用户管理服务为我的Spring启动项目。我一般了解DTO(数据传输对象)在Spring的使用。但是当我考虑设计服务时,我只对一个“用户”模型使用多个DTO,如UserDTO、注册用户DTO、更新用户DTO、管理用户DTO...UserDTO就像一个只读数据(带有用户名、电子邮件、姓名的输出数据),用于显示用户信息。但是注册用户DTO就像一个输入数据(带密码,确认密码为新用户创建密码),用

  • 我无法使用我拥有的多个数据库表: Input:User(表格用户)Input field:Email(表格用户)Input:Bookingnumber(表格Bookingnumber) 仅使用“用户”表单的输入字段有效,从其他表添加预订号会引发此错误: 问题类似于如何使用Spring和hiberNate将值插入多个表 spring错误中验证器的无效目标? 我只有两种形式,一种输出,只显示db数据,

  • 问题内容: 在Spring Security中,有多个身份验证提供程序的参考,但是找不到Java config中的示例。 以下链接给出了XML表示法: Spring Security中的多个身份验证提供程序 我们需要使用LDAP或DB进行身份验证 下面是我们的示例代码: 问题答案: 也许这会帮助你: