Bean验证:针对数据库的自定义验证

时间:2012-04-24 17:53:32

标签: java-ee jsf-2 cdi

以下代码有效,我需要知道的是,有没有办法使用注释注入EJB(或ManagedBean)(例如@EJB,@ Inject,@ Resource)

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

以下代码不起作用(变量逻辑永远不会被初始化 - null),我在WEB-INF目录中有一个空的beans.xml文件。 当我在ManagedBean,Servlet或EJB中直接使用@Inject然后它可以工作

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

有没有办法让这项工作?

2 个答案:

答案 0 :(得分:0)

开箱即用,但很容易实现将Hibernate Bean验证桥接到CDI。

在一个几乎相同的问题上查看that answer

答案 1 :(得分:0)

想法是编写自定义(注入启用) ConstraintValidatorFactory ,然后处理 ConstraintValidator 实例的注入。正如上面提到的答案,Seam-Validation module是一个很好的地方,可以看到它是如何完成的。

在Bean Validation 1.1容器(CDI)集成中将成为规范的一部分。见http://beanvalidation.org/proposals/BVAL-238/