前言:2019年09月23日臨下班,產品的一個變更需求臨近尾聲階段。本地測試OK,興致沖沖的想着發布到測試環境,驗證一下沒有問題,五分鍾結束戰斗,明天就開始下個需求了。隨在CE(公司的devOps系統)上切換到hotfix/xxx分支,部署上線。部署沒有問題,跑了一通單測,呃呃呃呃呃。莫名的一堆錯誤。怎么可能,再deploy ,再重啟,還是這個錯誤,難道是公司的CE有問題(以前會莫名其妙的出問題),釋放掉重新申請服務器部署。忙了一通還是不行。絕望,后悔。公司的什么爛逼環境。本地明明沒有問題,怎么部署一下就這樣了(程序員通病,嘻嘻)。得,沙箱環境壞了,解決不了別想走了,明天ISV還要用。
查問題:入口肯定先根據日志確定問題唄,單測錯誤日志如下:
2019-09-24 19:19:57.899 ERROR --- [io-12345-exec-1] c.y.p.g.facade.ParkingBizOpenApiImpl : (ParkingBizOpenApiImpl.java:90) : 參數校驗或轉換出錯javax.validation.UnexpectedTypeException: HV000030: No validator could be found for constraint 'javax.validation.constraints.NotBlank' validating type 'java.lang.String'. Check configuration for 'auth_code',輸入參數為:PrePayPTO(pay_type=ALIPAY, mch_id=2099190827010164, sub_mchid=20190827151134481925, auth_code=11111, total_amount=1, out_trade_no=ISV1569323953935, subject=測試訂單, goods_detail=[{"goods_id":"goods_id123","goods_name":"停車繳費","quantity":1,"price":1}], goods_tag=, attach=, extend_params={"industry_reflux_info":{"parking_id":"PI1509464128728884840","car_number":"京XX1234","einlass":"2019-08-15 17:30:26","parking_hours":"1.5","parking_name":"測試停車場"}}, service_name=PKTEST01)
看日志大概意思就是說@NotBlank注解不能用在屬性auth_code上,第一:我的代碼這塊沒有改過,以前明明可以運行,第二:我的auth_code就是String類型的,並且@NotBlank就是使用在String類型上 ,然后網上找了一堆的blog,隨發現有一個博客說springboot2.0 ,hibernate-validator版本沖突 也可能報這個錯,刪除本地所有引入的第三方包,然后重新import , 查看本地項目依賴,果然:
hibernate-validator 兩個版本號,6.0.16.Final 是我自己的, 5.2.4.Final 是哪里來的,隨查閱自己的show depencies , 查找hibernate-validator 的引入如圖:
根據兩個版本點進去,最后發現5.2.4.Final 是引入別人的dubbo依賴帶進來了,以前他們沒有,后加的(所以先前沒有暴露過問題,上圖中的密密麻麻的依賴圖也是引入他們的一個依賴后變成這樣不忍直視的樣子),然后從他們的依賴中排除掉hibernate-validator ,問題解決。
后記:
1:通過躺過的這個坑,我認為這雖然是編碼者導致的問題,也算是使用dubbo的一個弊端吧。
2:現在編碼的時候基本上都是一個project ,多個moduel的架構,所以很多時候暴露的dubbo接口的服務只是project的一個moudel ,而父pom中一般都會引入一下常用的依賴。這樣無形中被服務消費者強制依賴。所以建議dubbo 對外api,盡量不要繼承父pom,且以最少依賴發布接口。
3:以一個正常的心態,平心靜氣的分析問題,別什么問題都推脫給環境。
花絮:上面說的解決過程雖然很簡單,但是由於實際中操作中各種原因,折騰了三四個小時。
首先:始終堅信是環境問題,我寫的代碼肯定沒有問題;我壓根就沒有改過這里的代碼,而且已經穩定運行了很久。
其次:線上環境服務器不給開權限,下載不了jar包,本地剛開始沒有刪除本地所有第三方依賴,因為上面那個依賴圖太大,電腦死機,確認不了是哪個第三方依賴引入的依賴,且本地打包沒有問題,本地復現不了,線上的jar包看不到。
最后:因為別人的依賴坑了我,然后趕快看看我對外提供的dubbo接口pom:
還好,老子果然明智,沒有繼承父pom,獨立出去的。然后看看依賴:
啊,咋回事。。。。哎,沒辦法,產品要個性化提示校驗信息,要不就是好幾十行的if/else ,算了,就這樣吧,互坑互坑吧。。回家,睡覺。。。。。。。程序員不就是這樣,被別人坑人再坑別人嘛。。。。