你如何获得验证失败的字段?
验证失败的字段将在MethodConstraintViolationException
. 您通过调用检索各个违规行为getConstraintViolations()
,然后可以通过getPropertyPath()
节点检索和遍历该字段。
但是,如果您遇到响应中返回的字段名称与 bean 中的属性名称不匹配的情况,例如,如果您正在返回蛇案例响应(即user_name
),但您的 bean 属性名称是username
,则必须多一点创意。
在这种情况下,您可以将字段的名称存储为Payload
bean 验证注释上的 a。
响应字段:
@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();