2017-02-18 32 views
0

Насколько я знаю, в JEE7 Bean Validation автоматически интегрируется с CDI. Например, если я использую контейнер CDI, мне не нужно вводить и использовать javax.validation.Validator, чтобы проверить, нарушает ли мой компонент какой-либо ограничение. Таким образом, мне не нужно делать что-то вроде этого:Переопределить или отключить интеграцию CDI с верификацией Bean

@Inject 
Validator validator; 

... 

SoccerPlayer player = new SoccerPlayer(); 
    player.setFirstName(firstName); 
    player.setLastName(lastName); 
    player.setAge(age); 

Set<ConstraintViolation<SoccerPlayer>> violations = validator 
      .validate(player); 

Но следующий SoccerPlayer боб

public class SoccerPlayer { 

@NotNull 
@Size(min = 5) 
private String firstName; 

@NotNull 
@Size(min = 5) 
private String lastName; 

@Max(50) 
@Min(value=16, groups = GoalKeeper.class) 
private int age; 

private String position; 

public SoccerPlayer() { 
} 

// Getters and setters omitted 
} 

может автоматически проверки с @Valid аннотацию.

public class SoccerPlayerProcessor {  

    public void processPlayer(@Valid SoccerPlayer player){ 
     // Do stuff with the player. 
    } 
} 

Теперь в этом случае я не могу использовать группы в сочетании с аннотацией @Valid, чтобы разнообразить поведение проверки.

Итак, есть ли какой-либо метод для достижения моей цели? Или как альтернатива, могу ли я отключить интеграцию CDI с проверкой bean? Могу ли я переопределить стандартный CDI javax.validation.Validator с моей пользовательской реализацией?

Я использую профиль WebSphere Liberty в качестве сервера приложений.

Заранее спасибо.

РЕДАКТИРОВАТЬ:

Чтобы быть более точным, это выдержка из: https://docs.jboss.org/hibernate/validator/5.1/reference/en-US/html/validator-integration.html#section-integration-with-cdi

В версии 1.1, Бин Проверка интегрирована с CDI (контексты и Dependency Injection для JavaTM EE).

Эта интеграция обеспечивает КДИ управляемые компоненты для валидатора и ValidatorFactory и позволяет инъекции зависимостей в ограничении валидаторов, а также интерполяторы пользовательских сообщений, проходимые арбитров, скованность валидатор фабрику и имя параметра провайдеров.

Кроме того, ограничения параметров и возвращаемых значений для методов и конструкторы управляемых бинов CDI будут автоматически проверяться по вызову .

Когда приложение работает в контейнере Jave EE, эта интеграция включена по умолчанию.

Мой вопрос: есть ли способ отключить это поведение по умолчанию? Или, альтернативно, я могу переопределить перехватчик CDI по умолчанию? Или это невозможно?

+0

Что вы подразумеваете под «Я не могу использовать группы в сочетании с' @ Valid' annotation "? – Rouliboy

+0

Я имею в виду, если я хотел бы проверить SoccerPlayer с группой GoalKeeper.class? AFAIK Я не могу сделать что-то вроде @Valid (groups = GoalKeeper.class). Если бы я мог переопределить валидатор по умолчанию, я мог бы аннотировать мой API с помощью специальной аннотации (например, Validate, у которой есть поле group @Validate (groups = GoalKeeper.class)), и в Validator я мог собрать все компоненты, аннотированные с ним, и выполнить проверку с помощью определенной группы. – mancioshell

ответ

1

Попробуйте использовать @ConvertGroup для достижения желаемого результата.

Основываясь на вашем предыдущем примере, код будет выглядеть следующим образом.

public class SoccerPlayerProcessor {  

    public void processPlayer(@Valid @ConvertGroup(from=Default.class, to=GoalKeeper.class) SoccerPlayer player){ 
     // Do stuff with the player. 
    } 

Если вам нужно больше, чем один @ConvertGroup, используйте @ConvertGroup.List провести несколько аннотаций @ConvertGroup для того же элемента.

+0

Я бы рекомендовал использовать validator.forExecutables(). ValidateParameters (..) метод в вашем модульном тесте для проверки, если ваша проверка работает так, как должна. –