No validator could be found on JBoss EAP 7.2

📅 April 27, 2021 💬 0

最近處理到一個問題,明明應用程式的相依關係完整且以SpringBoot執行正常,但是一佈署到JBoss EAP 7.2執行就發生錯誤! 而且居然是HV000030找不到可用Validator?

2021-05-03更新
在事後的系統更新發現開發環境與測試環境的JBoss EAP版本不一致, 發生問題的完整版本號是JBoss EAP 7.2.0.Beta……是哪個混帳把這當傳家寶的(怒
所以其實是我的誤會,Red Hat的文件並沒說錯。

事件經過

目前工作在開發要佈署到JBoss EAP 7.2上的應用程式,其中使用JSR-380進行資料驗證。 相關程式以SpringBoot直接啟動沒有問題,但佈署到EAP之後卻發生無法驗證的問題。

...
javax.validation.UnexpectedTypeException: HV000030:
  No validator could be found for constraint 'javax.validation.constraints.NotBlank'
  validating type 'java.lang.String'. Check configuration for 'example.value'
    at o.h.v.i.e.c.ConstraintTree.throwExceptionForNullValidator(ConstraintTree.java:229)
    at o.h.v.i.e.c.ConstraintTree.getConstraintValidatorNoUnwrapping(ConstraintTree.java:310)
    at o.h.v.i.e.c.ConstraintTree.getConstraintValidatorInstanceForAutomaticUnwrapping(ConstraintTree.java:244)
    at o.h.v.i.e.c.ConstraintTree.getInitializedConstraintValidator(ConstraintTree.java:163)
    at o.h.v.i.e.c.ConstraintTree.validateConstraints(ConstraintTree.java:116)
    at o.h.v.i.e.c.ConstraintTree.validateConstraints(ConstraintTree.java:87)
    at o.h.v.i.m.c.MetaConstraint.validateConstraint(MetaConstraint.java:73)
    at o.h.v.i.e.ValidatorImpl.validateConstraintsForGroup(ValidatorImpl.java:1469)
    at o.h.v.i.e.ValidatorImpl.validateParametersForSingleGroup(ValidatorImpl.java:1260)
    at o.h.v.i.e.ValidatorImpl.validateParametersForGroup(ValidatorImpl.java:1189)
    at o.h.v.i.e.ValidatorImpl.validateParametersInContext(ValidatorImpl.java:1109)
    at o.h.v.i.e.ValidatorImpl.validateParameters(ValidatorImpl.java:302)
    at o.h.v.i.e.ValidatorImpl.validateParameters(ValidatorImpl.java:256)
    at o.s.v.b.MethodValidationInterceptor.invoke(MethodValidationInterceptor.java:105)
...

解析

JBoss EAP會主動為佈署的應用程式添加模組,且這些模組有更高的優先序, 故執行期間實際使用的套件不是由spring-boot-starter-validation提供、而是JBoss注入的版本。

本來這應該不是問題,NotBlank是在JSR-380新增的驗證規則,而JSR-380又在EE 8的規格內,理論上支援EE 8的EAP 7.2應該能正常運作才是。 但實際追溯JBoss EAP提供的模組定義可以發現javax.validation.api同時存在1.1和2.0兩個版本,而且還有一個參數ee8.preview.mode在決定由誰出場。

...
14:07:52,084 INFO  [org.jboss.as.ee] (ServerService Thread Pool -- 41) WFLYEE0119:
  The system property 'ee8.preview.mode' is NOT set to 'true'. For provided EE 8
  APIs where the EE 8 version of the API differs from what is supported in EE 7,
  the EE 7 variant of the API will be used. Support for this setting will be removed
  once all EE 8 APIs are provided and certified.
...

打撈啟動階段的輸出可以發現以上訊息。 其實JBoss EAP早在啟動的時候便已說明如要使用EE 8的功能需要將ee8.preview.mode設定為true,否則在正式發布以前仍會優先提供EE 7。

而EE 7的Bean Validation只有1.1。

/system-property=ee8.preview.mode:add(value=true)

執行以上指令並重啟JBoss EAP,該問題順利解決。

結論

翻遍JBoss EAP 7.2的文件找不到關於這個參數的隻字片語,僅在關聯產品EAP 7.2-betaEAP CD 14的發行備註找到短短一行說明, 反而是JBoss EAP的上游專案WildFly直接給他一個章節。賣服務的Red Hat的開源方案還真叫人安心🙄


Comments

No comment yet :D

Post comment

Please don't duplicate submitting.