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
和一个带有一个setter
setServletContext(ServletContext)
的新接口
ServletContextAware
。 然后,验证器工厂可以检查应该实例化的类是否实现了该接口,并设置
ServletContext
。 新的
ConstraintValidatorFactory
可用于创建新的
ValidatorFactory
,该工厂将用于创建所需的验证器

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

接口ServletContextArea{
公共void setServletContext(ServletContext上下文);
}
公共类ServletContextConstraintValidatorFactory实现ConstraintValidatorFactory{
私有ServletContext ServletContext;
公共ServletContextConstraintValidatorFactory(ServletContext ServletContext){
this.servletContext=servletContext;
}
@凌驾
公众的