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

带Spring组件的javax.validator

楚灿
2023-03-14

我使用javax。使用Spring进行验证。在我的测试(groovy)中,我显式地创建了验证器。

import javax.validation.Validation
import javax.validation.Validator
import javax.validation.ValidatorFactory

ValidatorFactory factory = Validation.buildDefaultValidatorFactory()
Validator validator = factory.getValidator()

when:
Set<ConstraintViolation<User>> constraints = validator.validate(entity)

我在java中的验证器

public class EntityDynamicValidator implements ConstraintValidator<SomeConstraint, Entity> {

    private GroupService groupService;

    // This constructor is required, see the link bellow.
    public UserDynamicEnumValidator() {
    }

    public UserDynamicEnumValidator(final GroupService groupService) {
        this.groupService = groupService;
    }

    @Override
    public boolean isValid(final Entity entity, final ConstraintValidatorContext context) {
        Something something = groupService.findByValue(entity.getValue());
        // Validate all this stuff
    }
}

我需要向验证器传递一个Spring服务。

我有一个默认构造函数,因为验证器存在Spring单元测试问题

共有2个答案

鞠鸿雪
2023-03-14

请随意分享您的知识。这就是我解决这项任务的方法。

我创建了一个Spring组件,它有一个静态字段(GroupService),该字段在构造函数中初始化。

@Component // Spring component.
class ServiceHolderComponent {
    
    private static GroupService GROUP_SERVICE;

    @Autowired
    public ServiceHolderComponent(final GroupService groupService) {
        GROUP_SERVICE = Validate.notNull(groupService); //apache lib
    }

    public static GroupService getGroupService() {
        return GROUP_SERVICE;
    }
}

现在验证程序使用默认构造函数。

public class EntityDynamicValidator implements ConstraintValidator<SomeConstraint, Entity> {

    private GroupService groupService;

    public UserDynamicEnumValidator() {
        this(ServiceHolderComponent.getGroupService());
    }

    public UserDynamicEnumValidator(final GroupService groupService) {
        this.groupService = groupService;
    }

    @Override
    public boolean isValid(final Entity entity, final ConstraintValidatorContext context) {
        Something something = groupService.findByValue(entity.getValue());
        // Validate all this stuff
    }
}

Apache库https://commons.apache.org/proper/commons-lang/apidocs/org/apache/commons/lang3/Validate.html

导入org.apache.commons.lang3.验证;

<!-- https://mvnrepository.com/artifact/org.apache.commons/commons-lang3 -->
<dependency>
    <groupId>org.apache.commons</groupId>
    <artifactId>commons-lang3</artifactId>
    <version>3.11</version>
</dependency>

裴泰平
2023-03-14

我也试着解决这个问题,但是测试在我这方面完全是低级单元测试,我想避免太多的上下文。我甚至不能用你的方法。我这边的解决方案是在mockmvc中添加一个定制的ConstraintValidatorBean。该自定义实现可以获得一个验证器类对象列表,因此如果工厂尝试创建验证器,我会返回一个Mockito。它的模拟版本而不是真实版本,我还可以查找期望设置。

 类似资料:
  • 我使用的是jdk8,需要创建一个以类名作为构造函数参数的Spring组件。但是,使用我当前的代码,我遇到了运行时错误: 这是我的博客类: 这就是我尝试创建类的方式: 我可以了解一下创建该组件的正确方法/这里出了什么问题吗?提前感谢。

  • 丝带组件是一种在任何内容上方显示信息的简便方法。.ribbon-warpper 必须位于具有 position:relative; 的元素内。在此文档页面中,我们将丝带放在 <div class="position-relative p-3 bg-gray" style="height: 180px"></div> 中,也可以将其放置在卡片、表格、行等元素上。 丝带组件有三种大小,以显示更多文本或

  • 问题内容: 我有一个名为lSession的javax.mail.Session和一个MimeMessage lMessage: 我得到了包含文件表示形式的字节数组列表: 我尝试将这些文件附加到邮件中,但无法修复…。 请,如果有人知道谁用字节数组附加文件? 问题答案: 试试这个代码:

  • 我正在为Joomla 2.5开发一个Joomla组件。因为它应该输出XML,所以我非常谨慎地不想显示周围的模板。 我已经尝试附加到网址: ?TMPl=组件 ?格式=原始 ?tmpl=原始 但是第一个将围绕内容输出生成一些HTML,第二个给我一个500错误。第三种方法根本不产生任何输出。我假设它正在寻找一个名为“raw”的模板,因为我在那里输入的任何其他乱七八糟的模板名称都会给出相同的结果。 如果没

  • 使用Angular ,我正在创建一个属性组件并向其中注入一个值。为此,我在这里跟随答案。 我想知道有没有一种方法,就像在AngularJS中一样,直接在组件中输入一个值,而不需要定义单独的< code>[form]=""。例如:<代码> 导致“。 我正在尝试将我的表单(通过变量)注入组件,但我不想进行其他绑定,例如根据这里的帖子,这应该是可能的,但我无法工作。自从更高的Angular版本以来,这种

  • 我正在探索新的Android架构组件,并希望将其实现到一个Android应用程序中。当我在iOS开发中使用MVVM时,我对MVVM非常了解。阅读了Google提供的Android Architecture Components guide:https://developer.Android.com/topic/libraries/Architecture/guide.html 我有几个问题...