spring webflux在配置方面相對於以前的spring mvc有了比較大的區別,但基本上都能在官方文件中找到:spring webflux、spring boot、spring boot gradle plugin,在文件中搜尋關鍵字或者直接google基本上都能解決配置方面的問題,這邊主要是記錄筆者在專案實踐過程中的一些問題,希望對大家有所幫助
使用@value能夠很簡單的獲取配置檔案中的取值,當然前提是@value所在的類會被自動注入
# 第乙個冒號之後的值會被當作預設值處理,沒有預設值的屬性必須在配置檔案中配置,否則會導致應用啟動報錯
/*** 讀取自定義配置
*/@value("$")
private string dev;
@configuration+@bean的配置能夠很方便的實現子庫的動態注入,再結合@import註解,又能夠實現configuration之間的靈活組合。
# 子庫中的配置
@configuration
@slf4j
public class libconfig
}# 啟動類的配置使用import將子庫的配置注入
@import(libconfig.class)
public class springwebfluxdemoconfig
}# 在configuration處加上conditional註解即可,這樣只有當customcondition返回true時,該configuration才會被自動注入
@configuration
@slf4j
@conditional(customcondition.class)
public class libconfig
@exceptionhandler(illegalacces***ception.class)
public monoconvertillegalaccesserror(exception e)
}
還有一部分是通過routerfunctions.route()配置的路由分發,這部分的異常並不會走到@exceptionhandler註解的方法中,需要在route配置的時候加上相應的異常處理。
routerfunctions.route(requestpredicates.post("/auth"),your handler).filter((request, next) -> next.handle(request)
.onerrorresume(exception.class, e -> serverresponse.status(httpstatus.internal_server_error).syncbody(your exception body)))
spring mvc有contextpath的配置選項,webflux因為沒有dispatchservlet,已經不支援contextpath了,一般來說都是在nginx統一配置路徑**就好了。本地除錯時可能就需要稍微注意下了,要麼本地也裝個nginx和線上環境保持一致,要麼就做差異化配置,還有種方法,通過webfilter的方式做一層contextpath的**,不過有一定風險,不推薦使用。
@component //所有/contextpath字首的請求都會自動去除該字首
public class contextpathfilter implements webfilter
return chain.filter(exchange.mutate().request(exchange.getrequest().mutate().path(requestpath).build()).build());
}}
@configuration
public class customwebfluxconfig implements webfluxconfigurer
/*** 也可以繼承corswebfilter使用@component註解,效果是一樣的
* @return
*/@bean
corswebfilter corswebfilter()
}
webflux已經沒有了interceptor的概念,但是可以通過webfilter的方式實現
@component
public class customwebfilter implements webfilter
//preprocess()
monoresponse = chain.filter(exchange);
//postprocess()
return response;
}}
有時可能需要統一攔截request/response物件,webflux中可以通過httpmessagereader/writer來實現,重寫webfluxconfigurer#configurehttpmessagecodecs方法,通過servercodecconfigurer註冊自定義的reader/writer即可
# 自定義reader
public class custommessagereader extends decoderhttpmessagereader
不過這邊有幾個需要注意的地方:1、按照官方文件,其實可以通過包裝encoder/decoder的方式實現,但是實踐中發現這種配置方式會被預設配置覆蓋,無法生效
2、customcodecs新增的reader/writer總是排在預設的reader/writer的後面,所以在預設的列表中已有的處理器會優先執行。根據規則reader/writer分兩種型別,一種是typed,只能解析具體型別的資料,一種是object,能夠執行多種型別的資料。所以,自定義的reader/writer要麼是預設列表中沒有的具體型別解析器,要麼只能關閉預設列表(不建議關閉,除非你能夠自定義接收所有可能資料型別的reader/writer)。
除此之外,還能夠採用一直取巧的方式:新增乙個可以解析object型別的reader/writer,然後複寫canread/canwrite方法使系統認為是typed型別的reader/writer,這樣就能在預設的object解析器之前執行了,具體**見demo
# basecodecconfigurer類
protected list> getwritersinternal(boolean formultipart)
gradle專案有時需要小心依賴更新不及時的問題,實踐過程中曾碰到自己庫裡面的class introspect failed的問題,google都是說第三方庫compile配置問題,結果最後發現是自己的api更新了但是gradle沒有拉下來導致的,清空gradle的快取重新拉一下就好了。
本地除錯時,如果是子模組專案,需要注意路徑設定的問題,可能導致無法載入到資源
以上就是專案過程中遇到的一些配置問題,配置只是皮毛,看一遍大家都會,webflux的核心還是要把裡面的響應式程式設計、對非同步的支援給吃透,前路漫漫其修遠兮,希望後面能有機會繼續總結webflux核心原理吧。
SpringWebFlux之無頭緒
1 springwebflux介紹 a 是spring5新增加的乙個框架,用於web 開發,功能和springmvc類似,webflux是用當前比較流行的響應式程式設計出現的框架 b 使用傳統的web框架,包括springmvc,這些都是基於servlet容器,而webflux是一種非同步非阻塞的框...
使用反應式spring webflux
org.springframework.bootgroupid spring boot starter webfluxartifactid dependency 下面新建乙個簡單的controller,乙個使用get,乙個使用post。該controller使用到了乙個簡單的值物件user,它裡面僅...
linux配置 網路配置
ip位址,子網掩碼,閘道器 設定ip位址,子網掩碼並啟用 ifconfig eth0 10.192.77.250 netmask 255.255.255.0 up 注 ip,掩碼,閘道器都設定到 etc sysconfig network scripts ifcfg eth0裡面了。設定多ip 可以...