2012-04-24 76 views
2

以下代码有效,我需要知道的是,是否有方法使用注释(例如@EJB,@Inject,@注入EJB(或ManagedBean)资源)Bean验证:针对数据库的自定义验证

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

下面的代码不能正常工作(可变逻辑永远不会初始化 - 空),我必须在WEB-INF目录下一个空的beans.xml文件。 当我使用@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验证桥接到CDI。

在几乎相同的问题上检查that answer