如何获得验证失败的字段?
未通过验证的字段将返回MethodConstraintViolationException
。您通过调用getConstraintViolations()
来检索个别违规,然后可以通过getPropertyPath()
检索该字段并在节点上行走。例如,如果您返回的是蛇案例响应(例如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验证框架查找在本地化文件中的消息在与以下命名约定的classpath的根目录:
ValidationMessages.properties
默认语言环境。
ValidationMessages_{locale}.properties
时,需要本地化
如果要覆盖此行为,改变被检索的验证消息,其中来自你可以使用Hibernate的验证供应商和实施定制ResourceBundleLocator
,你会添加到ResourceBundleMessageInterpolator
。
ValidatorFactory validatorFactory = Validation
.byProvider(HibernateValidator.class)
.configure()
.messageInterpolator(
new ResourceBundleMessageInterpolator(
new MyCustomResourceBundleLocator()))
.buildValidatorFactory();
如果我不想覆盖这些消息,而我只想获取默认验证消息? –
默认消息位于MessageConstraintViolation对象上。调用getMessage()方法。看看上面的例外映射代码。 – gregwhitaker
非常感谢您的澄清! –