【问题标题】:Access ServletContext in a ConstraintValidator在 ConstraintValidator 中访问 ServletContext
【发布时间】:2017-02-04 15:56:26
【问题描述】:

我希望使用约束验证器来验证输入。我的问题是我需要ServletContext 中包含的一些信息,例如属性文件的路径,来验证请求bean。我发现用Spring我可以使用@Autowired注解,但不幸的是我不能使用这个框架。

约束:

@Constraint(validateBy = MyValidationClass.class)
@Target(PARAMETER)
@Retention(RUNTIME)
public @interface  MyValidation {
    ...
}

我希望在约束验证器中做的事情是这样的:

@Override
public boolean isValid(RequestBean value, ConstraintValidatorContext context) {
    Properties props = servletContext.getAttribute("ws.props")
    // my validation
}

我怎样才能做到这一点?

【问题讨论】:

    标签: servlets jakarta-ee bean-validation


    【解决方案1】:

    这可能不是最好的解决方案。 (编辑:最后你可以在我的编辑中找到更好的解决方案)

    但我想你可以创建一个ServletContainerInitializer,将ServletContext 存储在一个静态变量中,然后在初始化程序中访问它。

    我觉得这里不太好的是,你对静态方法有很深的依赖。但除此之外,您可能会找到一种方法来挂钩实例化 ConstraintValidator 的进程。

    编辑:我刚刚查阅了 Hibernator Validator 文档。如果你正在使用 Hibernator Validator 实现,我想这里的这一章对你来说会很有趣:https://docs.jboss.org/hibernate/stable/validator/reference/en-US/html_single/#__code_constraintvalidatorfactory_code

    据此,我将创建一个自己的ConstraintValidatorFactory 和一个新接口ServletContextAware 和一个setter setServletContext(ServletContext)。 然后验证器工厂可以检查应该实例化的类是否实现了这个接口并设置ServletContext。 新的ConstraintValidatorFactory 可用于创建新的ValidatorFactory,该ValidatorFactory 将用于创建所需的验证器。

    只是一些未检查的代码示例:

    interface ServletContextArea {
        public void setServletContext(ServletContext context);
    }
    
    
    public class ServletContextConstraintValidatorFactory implements ConstraintValidatorFactory {
        private ServletContext servletContext;
    
        public ServletContextConstraintValidatorFactory(ServletContext servletContext) {
            this.servletContext = servletContext;
        }
    
        @Override
        public <T extends ConstraintValidator<?, ?>> T getInstance(Class<T> key) {
            // create instance from key as validator
    
            if(validator instanceof ServletContextAware) {
                ((ServletContextAware) validator).setServletContext(this.servletContext);
            }
            //...
    
            return validator;
        }
    
        @Override
        public void releaseInstance(ConstraintValidator<?, ?> instance) {
            //...
        }
    }
    
    // somewhere in the code where you have the servletContext available
    ValidatorFactory validatorFactory = Validation.byDefaultProvider()
        .configure()
        .constraintValidatorFactory( new ServletContextConstraintValidatorFactory(servletContext) )
        .buildValidatorFactory();
    Validator validator = validatorFactory.getValidator();
    

    【讨论】:

      猜你喜欢
      • 2015-03-10
      • 1970-01-01
      • 2013-11-08
      • 2018-12-22
      • 1970-01-01
      • 1970-01-01
      • 2012-04-04
      • 2011-04-23
      • 2011-01-21
      相关资源
      最近更新 更多