検証に失敗したフィールドを取得するにはどうすればよいですか?
検証に失敗したフィールドは に返されますMethodConstraintViolationException
。呼び出して個々の違反を取得すると、ノードをウォークしgetConstraintViolations()
てフィールドを取得できます。getPropertyPath()
ただし、応答で返されたフィールド名が Bean 内のプロパティの名前と一致しない場合、たとえば、スネーク ケースの応答 (つまりuser_name
) を返しているが、Bean プロパティ名がusername
である場合は、次のようにする必要があります。もう少しクリエイティブに。
Payload
このシナリオでは、フィールドの名前をBean 検証アノテーションとして保存できます。
応答フィールド:
@JsonProperty("user_name")
@NotEmpty(message = ErrorMessageKeys.USERNAME_REQUIRED,
payload = {FieldNamePayload.UserName.class})
private String username;
ペイロード クラス:
public class FieldNamePayload
{
/**
* Represents the field name "user_name"
*/
public static class UserName implements ValuePayload
{
private static final String value = "user_name";
@Override
public String getValue()
{
return value;
}
}
}
例外マッパーでペイロードを取得する:
List<MethodConstraintViolation<?>> violations = new ArrayList<MethodConstraintViolation<?>>(exception.getConstraintViolations());
for(MethodConstraintViolation<?> violation : violations)
{
String field = getFieldName(violation);
String message = violation.getMessage();
for(Class<? extends Payload> payload : new ArrayList<Class<? extends Payload>>(violation.getConstraintDescriptor().getPayload()))
{
//Retrieve field name from constraint payload
if(payload.isAssignableFrom(FieldNamePayload.UserName.class))
{
field = getPayloadValue(payload);
}
}
//Create an error response here!
}
関連付けられたメッセージをどのように取得しますか?
デフォルトでは、Bean 検証フレームワークは、クラスパスのルートにあるローカライズされたファイル内のメッセージを次の命名規則で検索します。
ValidationMessages.properties
デフォルトのロケール用。
ValidationMessages_{locale}.properties
ローカライズが必要な場合
この動作をオーバーライドし、検証メッセージが取得される場所を変更したい場合は、hibernate の検証プロバイダーを使用ResourceBundleLocator
して、に追加するカスタムを実装できますResourceBundleMessageInterpolator
。
ValidatorFactory validatorFactory = Validation
.byProvider(HibernateValidator.class)
.configure()
.messageInterpolator(
new ResourceBundleMessageInterpolator(
new MyCustomResourceBundleLocator()))
.buildValidatorFactory();