【问题标题】:Bean Validation: custom validation against the databaseBean Validation:针对数据库的自定义验证
【发布时间】:2012-05-05 09:48:14
【问题描述】:

以下代码有效,我需要知道的是,有没有办法使用注释(如@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;
    }
}

有没有办法让它工作?

【问题讨论】:

    标签: jakarta-ee jsf-2 cdi


    【解决方案1】:

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

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

    【讨论】:

      【解决方案2】:

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

      检查that answer 几乎相同的问题。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-04-07
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-12-24
        • 1970-01-01
        相关资源
        最近更新 更多