【问题标题】:Inject Spring Beans into Annotation-based Bean Validator将 Spring Bean 注入基于注解的 Bean Validator
【发布时间】:2014-04-08 13:49:07
【问题描述】:

我在 Spring MVC 应用程序中为 MultipartFile 编写了自定义 ConstraintValidator,如下所示:

@Documented
@Retention(RetentionPolicy.RUNTIME)
@Constraint(validatedBy = {MultipartFileNotEmptyValidator.class})
@Target({ ElementType.METHOD, ElementType.FIELD, ElementType.ANNOTATION_TYPE, ElementType.CONSTRUCTOR, ElementType.PARAMETER })
public @interface MultipartFileNotEmpty {
  String message() default "{errors.MultipartFileNotEmpty.message}";
  Class<?>[] groups() default {};
  Class<? extends Payload>[] payload() default {};
}

这是validatedBy 部分:

public class MultipartFileNotEmptyValidator implements ConstraintValidator<MultipartFileNotEmpty, MultipartFile>
{
  @Override
  public void initialize(MultipartFileNotEmpty annotation)
  {
    // Nothing here
  }

  @Override
  public boolean isValid(MultipartFile file, ConstraintValidatorContext context)
  {
    return !file.isEmpty();
  }
}

这个很有效,而且非常简单。我想做的是创建第二个来检查并确保MultipartFile 不是太大根据存储在数据库表中的值。我可以以某种方式将适当的服务注入到新的ConstraintValidator 类中以获取信息吗?

【问题讨论】:

  • 让它@Configurable
  • 使用 setter 将它的依赖项注入到控制器中。没有必要自动连接所有有依赖关系的东西。
  • 我认为它可以工作。你试过了吗?如果参数不会改变,我宁愿在应用程序开始时从数据库中加载该参数并将其存储在 ServletContext 中。

标签: java spring spring-mvc bean-validation


【解决方案1】:

实际上,使用@Autowired 并没有什么特别之处。来自Spring documentation

...一个 ConstraintValidator 实现可能有它的依赖项 @Autowired 像任何其他 Spring bean 一样。

【讨论】:

  • 无法进行构造函数注入。经典的春天。
  • @BenGeorge 不再正确。我可以确认构造函数注入运行良好,使用 Spring Boot 1.5.3,Spring 版本为 4.3.8
【解决方案2】:
@Component
public class MultipartFileNotEmptyValidator

然后您可以使用@Autowired 并注入依赖项。对我来说就像一个魅力。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-08-06
    • 2011-09-09
    • 2013-06-25
    • 2012-02-19
    • 2011-05-29
    • 1970-01-01
    相关资源
    最近更新 更多