Spring WebFlux配置實踐

2021-09-10 06:59:08 字數 3508 閱讀 5676

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 可以...