Java注释:通过注释验证列表中的基元

时间:2015-06-09 19:31:17

标签: java validation annotations hibernate-validator

我希望能够验证列表中的原语,我想知道是否有一种标准的方法。例如,验证列表中字符串的大小。

一个例子:

@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注释确实需要注释之后),但我找不到类似的东西。有什么想法吗?

2 个答案:

答案 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或使用其他工具。