2017-02-04 9 views
0

Я хочу проверить вход с помощью средства проверки ограничений. Моя проблема в том, что мне нужна информация, содержащаяся в файле ServletContext, например путь файла свойств, для проверки компонента запроса. Я нахожу, что с Spring могу использовать аннотацию @Autowired, но, к сожалению, я не могу использовать эту фреймворк.Доступ к ServletContext в ConstraintValidator

Ограничение:

@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 
} 

Как я могу добиться этого?

ответ

0

Это может быть не лучшее решение. (EDIT: вы можете найти лучшее решение в моем EDIT в конце)

Но я думаю, вы могли бы просто создать ServletContainerInitializer, который хранит ServletContext в статической переменной и получает доступ к этому внутри инициализатора.

Что мне здесь не очень приятно, так это то, что вы, чем глубокая зависимость от статического метода. Но в противном случае вы можете найти способ подключиться к процессу, который создает ConstraintValidator.

РЕДАКТИРОВАТЬ: Я просто просмотрел документацию валидатора гибернатора. И я предполагаю, что эта глава здесь будет интересно для вас, если вы используете реализацию Выжидающий Validator: https://docs.jboss.org/hibernate/stable/validator/reference/en-US/html_single/#__code_constraintvalidatorfactory_code

В соответствии с этим я хотел бы создать собственный ConstraintValidatorFactory и новый интерфейс ServletContextAware с одним сеттер setServletContext(ServletContext). Затем фабрика валидатора может проверить, реализует ли этот класс, который должен быть создан, и устанавливает ServletContext. Новый ConstraintValidatorFactory может быть использован для создания нового 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(); 
Смежные вопросы