2012-04-24 87 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