强制验证注解提供消息

Forcing validation annotation to provide a message

我正在使用休眠验证器来进行 POJO 验证,而且我还创建了一些自定义验证器。这是一个例子:

//lombok annotations
public class Address {
  @NotNull // standard
  @State //Custom created
  String country;
}

我们需要用特定代码而不是消息来表示所有验证错误。为了实现这一点,我们决定在我们使用的每个注释中指定代码。上面的例子现在看起来像这样:

//lombok annotations
public class Address {
  @NotNull(message="ERR_001")
  @State(message="ERR_002")
  String country;
}

但是我们在使用这种方法时遇到了问题。我们不能强制在注释中一直提供消息(在我们的例子中是错误代码)。对于自定义注释,它仍然可以,因为我们不提供默认消息,但对于标准注释,有机会错过它,如果我们不小心错过提供自定义消息,则会静默生成字符串消息。

有没有办法强制在注释中始终提供消息。保持一定的一致性可能会有所帮助。

据我所知,不,没有办法做到这一点。也许您最好的选择是创建自己的注释并使该属性成为必需属性。

Sevntu-Checkstyle provides additional checks to Checkstyle, including a check that an annotation is used with all required parameters.

<module name="RequiredParameterForAnnotation">
  <property name="annotationName" value="NotNull"/>
  <property name="requiredParameters" value="message"/>
</module>

我找不到好的处理方法。但现在我已经实施了一项测试,让我们可以对其进行一些控制。这不是最好的解决方案,但暂时解决了这个问题。

我正在使用类图读取包内 POJO 类 上的所有注释,并根据 javax 验证对其进行过滤,如果默认消息似乎来自 javax.validation,那么我将添加到一个列表。 稍后在单元测试中,我正在检查此列表是否为空。

private List<String> getAnnotationProperties(String appliedOn, AnnotationInfoList annotationInfos) {
    return annotationInfos.stream()
            .filter(annotationInfo -> annotationInfo.getName().contains("javax.validation.constraints"))
            .filter(annotationInfo -> ((String) annotationInfo.getParameterValues().getValue("message")).contains("javax.validation.constraints"))
            .map(annotationInfo -> annotationInfo.getName())
            .collect(Collectors.toList());
    }