これはできない可能性があります。ここでは、スタンドアロン何が起こっているかのテストとどのようにあなたがそれにフックするためのようなウォールド休止状態である:
public class ListBeanValidationTest {
public static void main(String[] args) {
List<Bean> asList = Arrays.asList(new Bean("test"), new Bean("test2"));
Validator v = Validators.newConfiguration().messageInterpolator(new MsgInterpolator()).buildValidatorFactory().getValidator();
// this is what DW does but i am lazy so you get the main version
if(asList instanceof Iterable) {
Iterable values = (Iterable) asList;
Set<ConstraintViolation<Object>> violations = new HashSet<>();
for(Object value : values) {
violations.addAll(v.validate(value));
}
violations.forEach(System.out::println);
}
}
public static class Bean {
Bean(String name) {
this.name = name;
}
String name;
@NotEmpty(message="bean not empty ${name}")
String wrong;
}
public static class MsgInterpolator implements MessageInterpolator {
@Override
public String interpolate(String messageTemplate, Context context) {
return interpolate(messageTemplate, context, Locale.getDefault());
}
@Override
public String interpolate(String messageTemplate, Context context, Locale locale) {
Object validatedValue = context.getValidatedValue();
return null;
}
}
}
MessageInterpolator
はここに問題です。それはあなたのためにメッセージを補間している時点でBeanのインスタンスを持っていないので、悲しいことに、その参照を使用することはできません。つまり、別の方法でこれを行う必要があります。
validator
への参照を取得することができます(これはDW環境で見つけることができます)。Guice
でDIを使用しています)。
これをDWの方法で実行したい場合は、次のように拡張することができます。 - これはDWリソースの検証を行うクラスです。 (私は自分自身をそれをやってしまった - アルトゥル
おかげ - https://docs.jboss.org/hibernate/validator/5.1/reference/en-US/html/chapter-message-interpolation.html#section-custom-message-interpolation
:
私はそれはあなたがここにもあなたに利用可能な検証のオプションにまで読むことができます
を役に立てば幸いバリデーターを注入するのが難しいと思った理由は分かりません) –
それは良い追加だろうかと思います。あなたの検証メッセージが同じBeanの別のプロパティに依存している場合は、それをどのように検証しますか? Bean全体がNullになるまでの依存性検証が行われ、メッセージ補間器がNPEになり、どちらが本当にうまくいかないかを検証します。私はそれがこれをしていないという背後にある彼らのモチベーションだと思います。また、Hibernateの検証はリストや配列をデフォルトでサポートしていないため、これは決して問題にならなかったかもしれません。 DWはそれ自体をハックする:) – pandaadb