2012-06-22 5 views
1

Я пытаюсь понять CDI, с очень небольшим количеством результатов на данный момент. :( На самом деле я stucked с веб-службы фасада, как этот пример:Проверка CDI по полученному параметру

@GET 
@Path("/greeting/{name}") 
@produces(mediatype.text_plain) 
public String sayHello(@PathParam("name") String name) 
{ 
    return "Hello " + name; 
} 

Поскольку использование CDI аннотацию я хотел бы сделать проверку на стороне сервера каждый раз, когда строка передается в качестве параметра, чтобы иметь comething как: (примечание @NameValidator аннотацию)

@GET 
@Path("/greeting/{name}") 
@Produces(mediatype.text_plain) 
public String sayHello(@NameValidator @PathParam("name") String name) 
{ 
    return "Hello " + name; 
} 

validaton может быть что-нибудь подобное, во внешнем классе:

if (name == "Andrea") { 
    throw new Exception();} 

Как это делает Работа? Является ли это возможным? Если нет, то какие альтернативы? Спасибо! Andrea

ответ

3

Вы можете использовать CDI's interceptor annotations и сделать что-то вроде:

... 
@Validated 
public String sayHello(@Validator(MyValidator.class) String name) { 
    ... 

Где @Validated связывает метод с ValidationInterceptor класса или около того, где вы используете @AroundInvoke метод и его параметр InvocationContext для проверки передаваемых параметров и подтвердите их.

Одна из «трудностей» с этим подходом заключается в том, что вам нужно будет использовать отражение, чтобы получить аннотацию @Validator и заданный класс проверки для каждого параметра, а затем создать/получить соответствующие экземпляры, прежде чем вы сможете окончательно выполнить фактическую проверку.

несколько иной подход был бы впрыснуть в Instance<T> из общего суперкласса/интерфейса ваших валидаторов в ValidationInterceptor и аннотирования sayHello параметров с валидатора классификаторов:

// in ValidationInterceptor: 

@Inject 
private Instance<Validator> validatorInstance; 

@AroundInvoke 
public Object validate(InvocationContext context) { 

    // get Annotation instances for target method parameters 
    // ... 

    Validator validator = 
     validatorInstance.select(annotations).get(); 

    // ... validator.validate(parameter); ... 

} 

// sayHello: 

... 
@Validated 
public String sayHello(@NameValidator String name) { 
    ... 

Чтобы получить параметр аннотаций из InvocationContext, сделать что-то вроде:

Annotation[][] annotations = context.getMethod().getParameterAnnotations(); 

Вы можете также рассмотреть вопрос о предварительной обработке этих аннотаций в качестве обработчика события @AfterBeanDiscovery.

3

Для этой проверки я предлагаю Seam Validation, который соединяет CDI с номером Hibernate-Validator. Это перехватывает вас на четко определенную валидацию-API в спящем конце позволяет писать код так:

public void registerUser(@Valid UserData data) {...}; 

Если вы не можете жить с зависимостью Шов 3 вы можете легко взять соответствующий исходный код CDI-расширение, это всего лишь несколько десятков строк кода.

Смежные вопросы