2012-04-24 1 views
2

Следующий код работает, что мне нужно знать, так это, есть ли способ вставить EJB (или ManagedBean) с помощью аннотаций (таких как @EJB, @Inject, @ Ресурс)Проверка бина: пользовательская валидация по базе данных

public class UniqueUsernameConstraintValidator implements ConstraintValidator<UniqueUsername, String> { 

//TODO research on how to inject an EJB/BusinessObject (@EJB does not work) 
private JournalBean bean; 

@Override 
public void initialize(UniqueUsername annotation) { 
//This is a fall back there must be a better way 
    try { 
     javax.naming.Context context = new InitialContext(); 
     bean = (JournalBean)context.lookup("java:global/Journal2/JournalBean"); 
    } catch (NamingException e) { 
     logger.info("NamingException: " + e.getMessage()); 
    } 
} 

public boolean isValid(String value, ConstraintValidatorContext context) { 
    if (value == null) { 
    return false; 
} 

if (null == bean.getUserByUsername(value)) { 
    return true; 
} 
    return false; 
} 
} 

следующий код не работает (переменная логика никогда не инициализируется - нуль), у меня есть пустой файл beans.xml в каталоге WEB-INF. Когда я использую @Inject в в ManagedBean, Servlet или EJB непосредственно, то он работает

public class UniqueUsernameConstraintValidator implements ConstraintValidator<UniqueUsername, String> { 

@Inject 
private Journal logic; 

@Override 
public void initialize(UniqueUsername annotation) { 
    logger.info("initialize("+annotation+")"); 
} 

@Override 
public boolean isValid(String value, ConstraintValidatorContext context) { 
    if (value == null) { 
     return false; 
    } 

    logger.warning("TODO: IMPLEMENT VALIDATION"); 
    try { 
     if (null != logic.getUserByUsername(value)) { //Null 
      return true; 
     } 
    } catch (EntityAccessorException e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
    } 
    return false; 
    } 
} 

Есть ли способ, чтобы сделать эту работу?

ответ

0

Это не работает из коробки, но легко достижимо купить мостик Hibernate Bean Validation для CDI.

Проверьте that answer на почти идентичный вопрос.

0

Идея заключается в том, чтобы написать свой обычай (инъекции включено) ConstraintValidatorFactory который затем обрабатывает инъекции в ConstraintValidator экземпляров. Как и в упомянутом выше ответе, Seam-Validation module - хорошее место, чтобы увидеть, как это делается.

Интеграция контейнера в бин 1.1 (контейнер CDI) будет частью спецификации. См. http://beanvalidation.org/proposals/BVAL-238/