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

在定制JSR-303验证器中使用@Autowired组件

孟思远
2023-03-14

我试图为我的模型类实现一个自定义验证器,该验证器依赖于我的自定义bean(通过@component声明)。在本文中,我遵循了有关该主题的Spring文档。我的AuthenticationFacade对象是根据本教程实现的。

但是,在运行我的测试时,validator对象中的autowired属性总是null。为什么会这样?

以下是我的代码的相关部分:

我的自定义bean,authenticationfacadeimpl.java

@Component
public class AuthenticationFacadeImpl implements AuthenticationFacade {
    boolean hasAnyRole(Collection<String> roles) {
        // checks currently logged in user roles
    }
}

我的自定义约束HasanyRoleConstraint.java

@Constraint(validatedBy = HasAnyRoleConstraintValidator.class)
@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.METHOD, ElementType.FIELD})
public @interface HasAnyRole {
    String[] value();
    String message() default "{HasAnyRole}";
    Class<?>[] groups() default {};
    Class<? extends Payload>[] payload() default {};
}
@Component
public class HasAnyRoleConstraintValidator implements ConstraintValidator<HasAnyRole, Object> {
    @Autowired
    AuthenticationFacade authenticationFacade;

    private String[] roles;

    @Override
    public void initialize(HasAnyRole hasAnyRole) {
        this.roles = hasAnyRole.value();
    }

    @Override
    public boolean isValid(Object target, ConstraintValidatorContext constraintValidatorContext) {
        return target == null || authenticationFacade.hasAnyRole(Arrays.asList(this.roles));
    }
}
@Entity
public class Article {
    // ...
    @HasAnyRole({"EDITOR", "ADMIN"})
    private String title;
    // ...
}
@Service
public class ArticleServiceImpl implements ArticleService {
    @Autowired
    private ArticleRepository articleRepository;

    @Autowired
    private AuthenticationFacade authenticationFacade;

    @Autowired
    private Validator validator;

    @Override
    @PreAuthorize("hasAnyRole('ADMIN', 'EDITOR')")
    public boolean createArticle(Article article, Errors errors) {
        articleRepository.save(article);
        return true;
    }

存储库ArtiClerePository.java使用Spring Data JPA的JParepository

public interface ArticleRepository extends JpaRepository<Article, Long> {
}

共有1个答案

从焱
2023-03-14

目前,我通过放弃Validator类的依赖项注入来解决这个问题,而是在构造函数中实例化AuthenticationFacadeImpl的实例。仍然很有趣,但是如何将控制器中的@valid与模型中的自定义验证器+@autowired属性结合起来,而不必在代码中明确调用验证器...

 类似资料:
  • 我正在用Spring和Thymeleaf填表: MyForm如下所示: 正如您所看到的,我做了一个自定义注释,它应该检查输入值是否可以解析为: 现在在我的Controller类中,我正在执行以下操作: 但是,当试图将放入文本字段以测试验证时,获取: 下面是我读到的示例,并希望用自定义验证器进行扩展:http://viralpatel.net/blogs/spring-mvc-hashmap-for

  • 我的bean中有两个字段 当字段key=“A”,“value”应该跟在其他“key”的特定Regex后面时,它可以是任何内容。 如何根据键定义此值验证。

  • 问题内容: 我有一个具有很多用JSR-303验证注释注释的字段的bean。现在有一个新的要求,其中一个字段是强制性的,但仅在某些条件下才是强制性的。 我环顾四周,找到了我需要的验证组。 这就是我现在所拥有的: 但是,当我在单元测试中运行此验证时: 事实证明,所有非组批注的验证都将被忽略,而我仅收到1次违规。 我可以理解这种行为,但是我想知道是否有一种方法可以使该组也包括所有未注释的参数。如果没有,

  • 我提出了一个使用JSR303组进行条件验证的概念。“有条件地”意味着我有一些字段,这些字段只有在另一个字段具有特定值时才相关。 示例:有一个选项可以选择是以个人身份注册还是以公司身份注册。选择公司时,用户必须填写包含公司名称的字段。 但是Spring由于数据绑定而打破了这个想法。在验证开始之前,Spring将数据绑定到RegisterForm。例如,如果类型不兼容(应为int值,但用户用字母填充表

  • 我们有一个带有JSR注释的简单bean 我们有一个Spring控制器 我们的问题是,当调用changePassword时,验证器忽略组(PasswordChange.Class)并只验证组中不存在的firstName和lastName。 知道吗?非常感谢你抽出时间。

  • 在添加Spring特定的配置之前,没有进行任何验证,但也没有任何错误。可能根本没有尝试验证。 现在我已经添加了必要的@Validated类注释和bean定义: 我得到以下错误: