6

重複の可能性:
FacesValidatorでの依存性注入(JSF検証)

たぶん、私は何か基本的なものが欠けています-しかし、メッセージリソースを使用するためにカスタムバリデータークラスでインジェクションを使用することはできませんか?次のコードは私にnullを与えるmsgので、インジェクションは明らかに機能しませんが、なぜですか?それが不可能な場合、どうすればメッセージリソースにアクセスできますか?これまでに見つけたすべての例では、バリデーターメッセージでハードコードされたテキストを使用していますが、これはローカリゼーションにはあまり役立ちません。

public class BirthdateValidator implements Validator {
    @Inject
    private transient ResourceBundle msg;

    @Override
    public void validate(FacesContext context, UIComponent component, Object value) throws ValidatorException {
            if ( [some validation fails] ) {
                FacesMessage message = new FacesMessage(msg.getString("validator.birthday"));
                message.setSeverity(FacesMessage.SEVERITY_ERROR);
            }
    }
}
4

1 に答える 1

10

そのように機能しない理由については、次の回答を参照してください:@EJB、@ PersistenceContext、@ Inject、@Autowiredを使用して@FacesValidatorに注入する方法@Named一言で言えば、代わりに注釈を付けて、またはの代わり@FacesValidatorに参照します。この問題は、JSF/CDIの担当者による監視が原因で発生します。これは、今後のJSF2.2で修正されます。<h:inputXxx validator><f:validator binding>#{birthdateValidator}


メッセージバンドルにアクセスするだけでよいので、インジェクションなしでアクセスするにはどうすればよいですか?

以下を使用してプログラムで評価しますApplication#evaluateExpressionGet()

ResourceBundle msg = context.getApplication().evaluateExpressionGet(context, "#{msg}", ResourceBundle.class);
// ...

特定のキーを選択することもできます。

String msg = context.getApplication().evaluateExpressionGet(context, "#{msg.key}", String.class);
// ...

参照:

于 2013-01-21T12:26:50.050 に答える