Java 无需字节码编织的 JSR-303 自动 Bean 验证

Java JSR-303 Automatic Bean Validation without Byte Code Weaving

有没有办法执行(或多或少)"automatic" JSR-303 java bean 验证而不需要对 class 进行运行时修改?

通常我看到人们使用 AspectJ 来完成此操作,但在使用运行时代码编织(如使用 cofoja)时我们遇到了很多复杂情况,因此我想避免使用它。它使我们的许多构建工具失败,因为运行时 class 文件与磁盘上的 class 文件不同。

我已经通过反射查看了 dynamic proxies,它只能代理接口(public 方法)并且如果你调用任何在 "this" 中注释的东西,你不会通过代理所以你失去了验证。

我还查看了 ByteBuddy 以寻找一种可能拦截 wrapping/redefining 和 class 的方法调用的方法。这里可能有一些东西,但我无法弄清楚如何拦截私有方法或在不返回修改原始 class.

的情况下完成上述操作

有什么想法吗?

理论上,您可以仅通过反射来强制执行 bean 验证。但我假设自动,你的意思是没有显式调用验证方法。

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