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、サーブレット、または 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

そのままでは機能しませんが、Hibernate Bean Validation を CDI にブリッジすることで簡単に実現できます。

ほぼ同じ質問でその回答を確認してください。

于 2012-04-24T18:21:12.607 に答える
0

アイデアは、カスタム (インジェクションが有効な) ConstraintValidatorFactoryを記述して、 ConstraintValidatorインスタンスへのインジェクションを処理することです。上記の回答のように、Seam-Validation モジュールは、それがどのように行われるかを確認するのに適した場所です。

Bean Validation 1.1 では、コンテナー (CDI) の統合が仕様の一部になります。http://beanvalidation.org/proposals/BVAL-238/を参照

于 2012-04-26T14:07:32.683 に答える