Servlets 在ConstraintValidator中访问ServletContext
我希望使用约束验证器验证输入。我的问题是我需要Servlets 在ConstraintValidator中访问ServletContext,servlets,jakarta-ee,bean-validation,Servlets,Jakarta Ee,Bean Validation,我希望使用约束验证器验证输入。我的问题是我需要ServletContext中包含的一些信息,例如属性文件的路径,以验证请求bean。我发现使用Spring可以使用@Autowired注释,但不幸的是,我不能使用这个框架 约束条件: @Constraint(validateBy = MyValidationClass.class) @Target(PARAMETER) @Retention(RUNTIME) public @interface MyValidation { ... }
ServletContext
中包含的一些信息,例如属性文件的路径,以验证请求bean。我发现使用Spring可以使用@Autowired
注释,但不幸的是,我不能使用这个框架
约束条件:
@Constraint(validateBy = MyValidationClass.class)
@Target(PARAMETER)
@Retention(RUNTIME)
public @interface MyValidation {
...
}
我希望在constraint validator中执行以下操作:
@Override
public boolean isValid(RequestBean value, ConstraintValidatorContext context) {
Properties props = servletContext.getAttribute("ws.props")
// my validation
}
如何实现这一点?这可能不是最好的解决方案。(编辑:最后你可以在我的编辑中找到更好的解决方案)
但是我想您可以创建一个ServletContainerInitializer
,它将ServletContext
存储在一个静态变量中,并在初始化器中访问它
我觉得这里不太好的地方是,您对静态方法的依赖性太深了。但除此之外,您可能会找到一种方法来钩住实例化ConstraintValidator
的流程
编辑:我刚刚查阅了Hibernator验证程序文档。如果您使用的是Hibernator Validator实现,我想这一章会让您感兴趣:
根据这一点,我将创建一个自己的ConstraintValidatorFactory
和一个带有一个settersetServletContext(ServletContext)
的新接口ServletContextAware
。
然后,验证器工厂可以检查应该实例化的类是否实现了该接口,并设置ServletContext
。
新的ConstraintValidatorFactory
可用于创建新的ValidatorFactory
,该工厂将用于创建所需的验证器
只是一些未检查的代码示例:
接口ServletContextArea{
公共void setServletContext(ServletContext上下文);
}
公共类ServletContextConstraintValidatorFactory实现ConstraintValidatorFactory{
私有ServletContext ServletContext;
公共ServletContextConstraintValidatorFactory(ServletContext ServletContext){
this.servletContext=servletContext;
}
@凌驾
公众的