2

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

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

有没有办法使这项工作?

4

2 回答 2

0

这个想法是编写您的自定义(启用注入)ConstraintValidatorFactory,然后将注入处理到ConstraintValidator实例中。正如上面提到的答案,Seam-Validation 模块是一个了解它是如何完成的好地方。

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

于 2012-04-26T14:07:32.683 回答
0

它不是开箱即用的,但很容易通过购买桥接 Hibernate Bean Validation 到 CDI 来实现。

检查一个几乎相同的问题的答案

于 2012-04-24T18:21:12.607 回答