2016-09-15 27 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(正在編寫文檔)。