如何获取未通过验证的字段?
验证失败的字段将在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();