2016-09-15 98 views
1

有没有一种方法可以执行(或多或少)“自动”JSR-303 java bean验证,而无需运行时修改类?没有字节代码编织的Java JSR-303自动Bean验证

通常我会看到有人使用AspectJ来完成这个任务,但是当我使用运行时代码编织(如cofoja)时,我们有很多复杂的问题需要避免。它使得我们的许多构建工具失败,因为运行时类文件与磁盘上的类文件不同。

我看过dynamic proxies通过只能代理接口(公共方法)的反射,如果你调用任何注释在“this”内的东西,你不再通过代理了,所以你失去了验证。

我也看过ByteBuddy的方法来通过包装/重新定义类来拦截方法调用。这里可能有些东西,但我不知道如何拦截私有方法或完成上述操作,而无需重新修改原始类。

任何想法?

+0

我相信Spring可以使用CGLib,但我不熟悉它的'@ Valid'路由的内部。 – chrylis

回答

2

理论上,您只能通过反射来强制bean验证。但我假设通过自动,你的意思是没有明确的调用验证方法。

在这种情况下,仪表可能是您唯一的选择。借助Byte Buddy,您可以使用重新定义或重新绑定来衡量现有方法。最简单的方法是使用代理构建器的Java代理或使用Gradle或Maven插件进行构建时间检测。该文档提供了一个如何实现代理的示例,构建工具有很多javadoc(正在编写文档)。