0

私は、Springブートと国際化でjavax検証アノテーションを使用しています。だから私は、次のフィールドがあります。javaxバリデーションで国際化を使用する場合、フィールド名の挿入方法は?

@Size(min = 3, max = 3, message = "{javax.validation.constraints.Size.message}") 
private String currencyCode; 

米国のリソースバンドルがあります。このフィールドは、検証に失敗したとき

javax.validation.constraints.Size.message = size must be between {min} and {max} 

だから、私はメッセージ "size must be between 3 and 3"を参照してください。メッセージ "currencyCode's size must be between 3 and 3"につながる

javax.validation.constraints.Size.message = {fieldName}'s size must be between {min} and {max} 

しかし、私が望むのようなメッセージを持っていることです。

これは可能ですか? Beanをオーバーライドして動作させる必要がありますか?フィールド名にあらかじめ定義されたプロパティはありますか?あなたがそれらの内側MethodArgumentNotValidException

@ExceptionHandler(MethodArgumentNotValidException.class) 
public Object handleMethodArgumentNotValidException(final MethodArgumentNotValidException e) { ... 

のハンドラを作成することができます

答えて

2

ます。これは、無効なフィールドエラーなどに関するすべての情報を持つコレクションです

e.getBindingResult().getFieldErrors(); 

を呼び出すことができます。フィールド名、拒否された値。

で次、あなたの例のようなメッセージを使用してorg.apache.commons.lang3からStrSubstitutorを使用しています。ただ、パラメータ

キーのマップを作成 - >フィールド名、値 - もちろん> CURRENCYCODE

はあなたには、いくつかのコードを記述する必要がありますが、ここでのソリューションです:)

+0

あなたはStrSubstitutorを使用するとはどういう意味ですか? –

+0

ありがとう、これは本質的に答えです。私はちょうど 'fieldError.getDefaultMessage()を使用します。replace(" {fieldName} "、fieldError.getField()); –

+0

私はこれを意味します ' Map valuesMap = HashMap(); valuesMap.put( "animal"、 "quick brown fox"); valuesMap.put( "target"、 "lazy dog"); String templateString = "$ {animal}は$ {target}にジャンプします。「; StrSubstitutorサブ=新しいStrSubstitutor(valuesMap); 文字列resolvedString = sub.replace(templateString); ' と を引き起こす'速い茶色のキツネが怠惰なdog.' 飛び越えしかし、あなたのソリューションも良いです –

0

デフォルト@sizeアノテーションでありませんメッセージにラベルを配置するオプションを提供し、それはあなたのアプリケーションで使用できるように、代わりにあなたは以下のような独自の実装を作成することができません。

@Target({ METHOD, FIELD, ANNOTATION_TYPE, CONSTRUCTOR, PARAMETER }) 
@Retention(RUNTIME) 
@Documented 
@Constraint(validatedBy = MySizeValidator.class) 
public @interface MySize { 

    String message() default "{javax.validation.constraints.Size.message}"; 

    Class<?>[] groups() default {}; 

    Class<? extends Payload>[] payload() default {}; 

    int min() default 0; 

    int max() default Integer.MAX_VALUE; 

    @Target({ METHOD, FIELD, ANNOTATION_TYPE, CONSTRUCTOR, PARAMETER }) 
    @Retention(RUNTIME) 
    @Documented 
    @interface List { 

     Size[] value(); 
    } 

    public abstract String label(); 
} 

その後、ベルのようなMySize注釈を検証するためにMySizeValidatorのような独自のバリデータを作成します

public class MySizeValidator implements ConstraintValidator<MySize, String> { 

    private static final Log log = LoggerFactory.make(); 

    private int min; 
    private int max; 

    @Override 
    public void initialize(MySize parameters) { 
     min = parameters.min(); 
     max = parameters.max(); 
     validateParameters(); 
    } 

    @Override 
    public boolean isValid(String field, ConstraintValidatorContext constraintValidatorContext) { 
     if (field == null) { 
      return true; 
     } 
     int length = field.length(); 
     return length >= min && length <= max; 
    } 

    private void validateParameters() { 
     if (min < 0) { 
      throw log.getMinCannotBeNegativeException(); 
     } 
     if (max < 0) { 
      throw log.getMaxCannotBeNegativeException(); 
     } 
     if (max < min) { 
      throw log.getLengthCannotBeNegativeException(); 
     } 
    } 
} 

OW

javax.validation.constraints.mySize.message = {ラベル}のサイズは、次にで{分}と{最大}

の間でなければならないキー値を下回るとValidationMessages.propertiesを作成あなたのPOJOは、あなたがこの新しい注釈を入れることができ、

@MySize(min = 3, max = 3, message = "{javax.validation.constraints.mySize.message}", label = "Currency Code") 
    private String currencyCode; 
+0

参照してください。 –

+0

その解決策では、たとえばfieldNameがPOJOのcurrencyCodeであるが、画面に「通貨コード」を表示しなければならない場合は、ラベルを正しくフォーマットする必要があります。次に、どこかに地図を置く必要がありますフィールドcurrencyCodeが来ている場合は通貨コードに置き換えてください。もう1つの問題は、同じフィールド名を持つ2つのPOJOの記述が異なる場合です。たとえば、「現在のコード」としてラベルを返したい場合や、 "通貨"としてラベルを返すと、ハックの解決策が混乱するy、独自のバリデータ/注釈を作成するのは、春にも使用されるクリーンなソリューションです –

+0

しかし、あなたの呼び出しは、私はきれいなソリューションを提供すると考えています –

関連する問題