Как вы получите поле, которое не удалось проверить?
Неверное подтверждение будет возвращено в MethodConstraintViolationException
. Вы получаете отдельные нарушения, вызывая getConstraintViolations()
, а затем поле может быть получено getPropertyPath()
и ходьбе по узлам.
Однако, если у вас есть случай, когда имя поля, возвращаемое в ответе, не совпадает с именем свойства в bean-компоненте, например, если вы возвращаете ответы на вопрос о змеи (то есть user_name
), но имя свойства bean username
, вам нужно сделать немного более творческим.
В этом сценарии вы можете сохранить имя поля как Payload
в аннотации проверки компонента.
поле Ответ:
@JsonProperty("user_name")
@NotEmpty(message = ErrorMessageKeys.USERNAME_REQUIRED,
payload = {FieldNamePayload.UserName.class})
private String username;
Payload Класс:
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;
}
}
}
Получение Payload в вашем Exception Mapper:
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!
}
Как вы можете получить связанное сообщение?
По умолчанию рамка проверки боба смотрит сообщения в локализованных файлах в корневом каталоге с путем класса следующего соглашения об именах:
ValidationMessages.properties
для локал по умолчанию.
ValidationMessages_{locale}.properties
при локализации требуется
Если вы хотите, чтобы переопределить это поведение и изменить, где сообщение проверки в настоящее время извлекается из вы можете использовать поставщик проверки Hibernate и реализовать пользовательские ResourceBundleLocator
, которые вы бы добавить к ResourceBundleMessageInterpolator
.
ValidatorFactory validatorFactory = Validation
.byProvider(HibernateValidator.class)
.configure()
.messageInterpolator(
new ResourceBundleMessageInterpolator(
new MyCustomResourceBundleLocator()))
.buildValidatorFactory();
Если я не хочу переопределять сообщения, и я просто хочу получить сообщение о проверке по умолчанию? –
Сообщения по умолчанию находятся в объекте MessageConstraintViolation. Вызвать метод getMessage(). Взгляните на приведенный выше код карты исключений. – gregwhitaker
Большое спасибо за разъяснение! –