Java注解:通过注解验证列表中的基本类型

4
我希望能够验证列表中的基本类型,并想知道是否有标准的方法来实现。例如,验证列表中字符串的大小。
一个例子:
@Size(max = 64)  // validates that a string is max 64 chars.
private String name;

@Size(max = 64)  // validates that the list size is max 64 items.
private List<String> names;

// What I want:
@ValidateInsidePrimitives(
   @Size(max = 64)
)
private List<String> names;

我看到人们做的是将基本类型包装成对象来实现这一点:
@Valid
private List<NameObj> names;

或者制作验证字符串列表的自定义注释:

@MyCustomListStringSizeAnnotation(max = 64) 
private List<String> names;

或者使用Java 8新注释的放置方式,如下所示:

private List<@Size(max = 64) String> names;

但我并不太喜欢前两种方法,而且我无法将我的应用程序移植到Java 8。

在我看来,我上面起草的 "@ValidateInsidePrimitives" 应该可以工作(毕竟 *.List 注释确实接受注释),但我找不到类似的东西。有什么想法吗?


你尝试过自定义约束吗?https://docs.jboss.org/hibernate/validator/4.0.1/reference/en/html/validator-customconstraints.html - Ezequiel
我之前已经说过这是可能的,我举了一个"@MyCustomListStringSizeAnnotation(max = 64)"的例子。但是我下面也说了,我不喜欢这种方法。 - art123
2个回答

2
< p >使用@ValidateInsidePrimitives的问题在于它无法以通用方式实现。

注释成员(如value())只能具有特定的其他注释类型作为类型,但不能是java.lang.annotation.Annotation(这就是为什么每个BV内置约束都有专门的@List约束的原因)。因此,您可以为@Size实现@ValidateInsidePrimitives,但必须为要支持的每个其他基本约束这样做。

如果您还无法迁移到Java 8,则最好实现自定义的@MyCustomListStringSizeAnnotation约束。


0

即使您无法将应用程序移植到Java 8,也可以利用Java 8类型注释。

特别是,您可以使用Checker Framework编写可插拔的类型检查器。然后,在您的代码中,您可以像这样编写注释中的注释

List</*@Size(max=64)*/ String> 

Checker Framework可以处理注释中的注解,就像您没有注释一样编写它们一样。然而,普通的Java编译器只会看到并忽略注释,因此您的代码仍然可以使用任何Java编译器进行编译。

在编译时,Checker Framework运行您的可插拔类型检查器并强制执行您指定的语义。

请注意,Checker Framework进行类型检查以为您提供有关将放入列表中的值的编译时保证。它不会向您的代码添加运行时断言,以便在将不需要的值放入列表时引发错误。如果您想要运行时检查,则需要扩展Checker Framework或使用其他工具。


有趣的解决方案 :) - art123

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接