DropWizard @ValidationMethod更改属性名称

时间:2015-06-17 10:35:33

标签: java jackson dropwizard hibernate-validator

我在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”=“密码不得包含或等于用户名”

有办法做到这一点吗?

1 个答案:

答案 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"