我希望能够验证列表中的原语,我想知道是否有一种标准的方法。例如,验证列表中字符串的大小。
一个例子:
@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 new annotations placement,如下所示:
private List<@Size(max = 64) String> names;
但我真的不喜欢前两种方法,而且我无法将我的应用程序移植到java 8.
在我看来,我上面起草的“@ValidateInsidePrimitives”应该可以工作(在所有* .List注释确实需要注释之后),但我找不到类似的东西。有什么想法吗?
答案 0 :(得分:2)
@ValidateInsidePrimitives
的问题在于它无法以通用方式实现。
注释成员(例如value()
)只能将特定的其他注释类型作为类型,而不能java.lang.annotation.Annotation
(这就是为什么每个BV都有一个专用的@List
约束的原因内置约束)。因此,您可以为@ValidateInsidePrimitives
实现@Size
,但必须为其他基本约束支持。
如果您还不能迁移到Java 8,最好还是实现自定义@MyCustomListStringSizeAnnotation
约束。
答案 1 :(得分:0)
即使您无法将应用程序移植到Java 8,也可以利用Java 8类型注释。
特别是,您可以使用Checker Framework编写可插入的类型检查器。然后,在您的代码中编写annotations in comments,如下所示:
List</*@Size(max=64)*/ String>
Checker Framework处理注释中的注释,就像您在没有注释的情况下编写注释一样。但是,普通的Java编译器只会看到并忽略注释,因此您的代码将继续使用任何Java编译器进行编译。
在编译时,Checker Framework运行您的可插入类型检查器并强制执行您指定的语义。
请注意,Checker Framework会进行类型检查,以便为您提供有关将哪些值放入列表的编译时保证。它不会向您的代码添加运行时断言,因此如果在列表中放入了不需要的值,您的代码将引发错误。如果您想要运行时检查,则需要扩展Checker Framework或使用其他工具。