我在Dropwizard中有一个Representation,其中包含注释@ValidationMethod的方法。
Dropwizard示例:
@ValidationMethod(message="may not be Coda")
public boolean isNotCoda() {
return !("Coda".equals(name));
}
请注意,该方法必须以“是”开头。这是Hibernate Validator的限制。
我的例子:
@NotBlank(message = REQUIRED)
private String password;
@JsonIgnore
@ValidationMethod(message = "the password fields must match")
public boolean isPasswordEqualRepeatedPassword() {
}
@JsonIgnore
@ValidationMethod(message = "the password must not contain or be equal to the username")
public boolean isNotEqualOrContainUsername(){
}
当前回应:
“field”:“PasswordEqualRepeatedPassword”, “message”=“密码字段必须匹配”
“field”:“NotEqualOrContainUsername”, “message”=“密码不得包含或等于用户名”
我希望字段与class属性一样等于密码。问题是我无法命名 isPassword()获取以下响应的方法:
“field”:“密码”, “message”=“密码字段必须匹配”
“field”:“密码”, “message”=“密码不得包含或等于用户名”
有办法做到这一点吗?
答案 0 :(得分:0)
不幸的是,通过重新实现 dropwizard 已实现的许多功能,这是可行的。我们需要在错误时返回自定义对象,而且还有其他缺点,所以进入了一些反射兔子洞。不过我们很久以前就实现了,所以现在可能会更容易,所以我将分享相关的部分来实现这一点。
针对此特定问题,我们通过向验证消息添加自定义字符串格式来解决此问题。
@ValidationMethod(message = "[password]the password fields must match")
然后当我们解析消息时,我们获取“密码”字段。
首先,我们通过实现异常映射器来自己处理验证错误。
public class UnprocessableEntityExceptionMapper implements ExceptionMapper<ConstraintViolationException> {
@Override
public Response toResponse(ConstraintViolationException exception) {
return Response
.status(422)
.entity(doMagic(exception))
.type(MediaType.APPLICATION_JSON_TYPE)
.build();
}
}
doMagic
是潜在的兔子洞,但我建议在那里尝试并调试,然后返回一个对象,该对象将在 JSON 中表示您的错误。相关位:
exception.getConstraintViolations()
将返回要处理的违规列表。constraintViolation.getConstraintDescriptor().getAnnotation() instanceof ValidationMethod
是你如何知道它是一个 dropwizard ValidationMethod。constraintViolation.getMessage()
在本例中将返回 "[password]the password fields must match"
。