WebFlux üçin Java-konfigurasiýasy soraglary işlemek üçin gerekli komponentleri, anotasiýa edilen controller-lary ýa-da funksiýa gutarnykly nokatlary bilen bilelikde yglan edýär we konfigurasiýany sazlamak üçin API üpjün edýär. Bu, Java-konfigurasiýasy tarapyndan döredilen esasy bean-lary öwrenmegiň gerekdiginini aňladýar.
Konfigurasiýa API-yň elýeterli däldiginden has giňeldilen sazlamalar gerek bolsa, siz giňeldilen konfigurasiýa re modeimi arkaly doly kontrol alyp bilersiňiz.
WebFlux Konfigurasiýasynyň Işledilmegi
Siz Java-konfigurasiýada @EnableWebFlux
anotasiýasyny ulanyp bilersiňiz, aşakdaky mysalda görkezilişi ýaly:
@Configuration
@EnableWebFlux
public class WebConfig {
}
@Configuration
@EnableWebFlux
class WebConfig
Öňki mysalda, Spring WebFlux infrastruktura bean-larynyň hatary hasaba alynýar we classpath-de elýeterli bolan baglanşyklara (zawisimostlar) - JSON, XML we beýleki formatlar üçin uýgunlaşdyrylýar.
WebFlux Konfigurasiýa API
Java-konfigurasiýaňyzda WebFluxConfigurer
interfeýsini durmuşa geçirip bilersiňiz, aşakdaky mysalda görkezilişi ýaly:
@Configuration
@EnableWebFlux
public class WebConfig implements WebFluxConfigurer {
// Konfigurasiýanyň metodlaryny durmuşa geçirýäris...
}
@Configuration
@EnableWebFlux
class WebConfig : WebFluxConfigurer {
// Konfigurasiýanyň metodlaryny durmuşa geçirýäris...
}
Transformasiýa, formatlamak
Adaty ýagdaýda dürli sanlar we sanalar üçin formatlaýjylar gurlupdyr we @NumberFormat
we @DateTimeFormat
üsti bilen sazlamalary eýýäm goýmaga mümkinçilik döredilýär.
Java-konfigurasiýada ýörite formatlaýjy we transformatory hasaba almak üçin aşakdaky ýaly ulanyň:
@Configuration
@EnableWebFlux
public class WebConfig implements WebFluxConfigurer {
@Override
public void addFormatters(FormatterRegistry registry) {
// ...
}
}
@Configuration
@EnableWebFlux
class WebConfig : WebFluxConfigurer {
override fun addFormatters(registry: FormatterRegistry) {
// ...
}
}
Adaty ýagdaýda, Spring WebFlux soragyň lokalizasiýa sazlamalaryny sene gymmatlyklaryny analiz etmekde we formatlamada göz öňünde tutýar. Bu formalar üçin dogry bolup durýar, haçan-da sene hökmünde teswirlenýän string görnüşindäki formalar ulanylanda. Emma forma ýerleriniň HTML spesifikasiýasynda kesgitlenen düýbünden kesgitlenen format ulanylýar. Mundan başga-da sene we wagt görnüşlerini aşakdaky ýaly sazlap bilersiňiz:
@Configuration
@EnableWebFlux
public class WebConfig implements WebFluxConfigurer {
@Override
public void addFormatters(FormatterRegistry registry) {
DateTimeFormatterRegistrar registrar = new DateTimeFormatterRegistrar();
registrar.setUseIsoFormat(true);
registrar.registerFormatters(registry);
}
}
@Configuration
@EnableWebFlux
class WebConfig : WebFluxConfigurer {
override fun addFormatters(registry: FormatterRegistry) {
val registrar = DateTimeFormatterRegistrar()
registrar.setUseIsoFormat(true)
registrar.registerFormatters(registry)
}
}
Waliadasiýa
Adaty ýagdaýda, eger classpath-de Bean Validation (meselen, Hibernate Validator) bar bolsa, LocalValidatorFactoryBean
dünýäde bar validator hökmünde registririlýär, @Valid
annotasiýasynyň we methodleriň argumentleriniň Validated
häsiýetlerini ulanmaga mümkinçilik berýär.
Java-konfigurasiýada dünýäde bar Validator
nusgasyny sazlamak mümkinçiligi berilýär, aşakdaky mysalda görkezilişi ýaly:
@Configuration
@EnableWebFlux
public class WebConfig implements WebFluxConfigurer {
@Override
public Validator getValidator() {
// ...
}
}
@Configuration
@EnableWebFlux
class WebConfig : WebFluxConfigurer {
override fun getValidator(): Validator {
// ...
}
}
Şeýle hem, lokal Validator
implementasiýalaryny hasaba alyş mümkindigini aşakdaky mysalda görkezmek mümkin:
@Controller
public class MyController {
@InitBinder
protected void initBinder(WebDataBinder binder) {
binder.addValidators(new FooValidator());
}
}
@Controller
class MyController {
@InitBinder
protected fun initBinder(binder: WebDataBinder) {
binder.addValidators(FooValidator())
}
}
LocalValidatorFactoryBean
başga bir ýere girizilmek zerur bolsa, bean dörediň we ony
@Primary
annotasiýa bilen belgilemek üçin, MVC konfigurasiýasynda yglan edilen bilen gapma-garşylygyndan gaça duruň.
Kontent tiplerini tanama
Spring WebFlux-yň soragdan @Controller
nusgalary ulanyp, talap edilýän geçiriji maglumatlaryň görnüşlerini nähili kesgitleýandigini sazlap bilersiňiz. Adatça diňe Accept
başlygy barlanýar, emma sorag parametrlere esaslanýan strategiýany hem işjeňleşdirip bilersiňiz.
Aşakdaky mysalda talap edilýän kontent tipiniň kesgitlenmegini nähili sazlamak mümkinçiligi görkezilýär:
@Configuration
@EnableWebFlux
public class WebConfig implements WebFluxConfigurer {
@Override
public void configureContentTypeResolver(RequestedContentTypeResolverBuilder builder) {
// ...
}
}
@Configuration
@EnableWebFlux
class WebConfig : WebFluxConfigurer {
override fun configureContentTypeResolver(builder: RequestedContentTypeResolverBuilder) {
// ...
}
}
HTTP Protokoly Arkaly Ibermek üçin Habar Kodlari
Aşakdaky mysalda soragyň we jogapyň bedenini okamak we ýazmak üçin nähili sazlamak mümkinçiligi görkezilýär:
@Configuration
@EnableWebFlux
public class WebConfig implements WebFluxConfigurer {
@Override
public void configureHttpMessageCodecs(ServerCodecConfigurer configurer) {
configurer.defaultCodecs().maxInMemorySize(512 * 1024);
}
}
@Configuration
@EnableWebFlux
class WebConfig : WebFluxConfigurer {
override fun configureHttpMessageCodecs(configurer: ServerCodecConfigurer) {
// ...
}
}
ServerCodecConfigurer
adaty okyjylar we ýazyjylar bilen üpjün edýär. Mundan başga-da, goşmaça okyjylar we ýazyjylar goşmak, adaty sazlamalary üýgetmek ýa-da doly çalyşmak üçin ulanyp bilersiňiz.
Jackson JSON we XML üçin Jackson2ObjectMapperBuilder
-ni ulanmak mümkin, ol Jackson kitaphananyň häsiýetlerini adaty ýagdaýda aşakdakylara sazlar:
-
DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES
– öçürilen. -
MapperFeature.DEFAULT_VIEW_INCLUSION
– öçürilen.
Şeýle hem, classpath-de tapylan halatynda awtomatiki ýagdaýda aşakdaky bellige alnan modullar hasaba alynýar:
-
jackson-datatype-joda
: Joda-Time görnüşleriniň goldawy. -
jackson-datatype-jsr310
: Java 8 taryh we wagt API görnüşleriniň goldawy. -
jackson-datatype-jdk8
: Java 8-iň beýleki görnüşleri üçin goldawy, meselemOptional
. -
jackson-module-kotlin
: Kotlin sinifleri we maglumat sinifleri üçin goldawy.
Prezentasiýa Tanama
Näme üçin sazlamak mümkinçiligi goýuldy.
@Configuration
@EnableWebFlux
public class WebConfig implements WebFluxConfigurer {
@Override
public void configureViewResolvers(ViewResolverRegistry registry) {
// ...
}
}
@Configuration
@EnableWebFlux
class WebConfig : WebFluxConfigurer {
override fun configureViewResolvers(registry: ViewResolverRegistry) {
// ...
}
}
ViewResolverRegistry
Spring Framework bilen integrasiýa tehnologiýasy üçin gysgaça sanawlar bilen üpjün edýär. Aşakdaky mysalda FreeMarker ulanylýar (onuň üçin FreeMarker-yň esasy tehnologiýasy hem sazlamaly):
@Configuration
@EnableWebFlux
public class WebConfig implements WebFluxConfigurer {
@Override
public void configureViewResolvers(ViewResolverRegistry registry) {
registry.freeMarker();
}
// FreeMarker'i konfigurirläýäris...
@Bean
public FreeMarkerConfigurer freeMarkerConfigurer() {
FreeMarkerConfigurer configurer = new FreeMarkerConfigurer();
configurer.setTemplateLoaderPath("classpath:/templates");
return configurer;
}
}
@Configuration
@EnableWebFlux
class WebConfig : WebFluxConfigurer {
override fun configureViewResolvers(registry: ViewResolverRegistry) {
registry.freeMarker()
}
// FreeMarker'i konfigurirläýäris...
@Bean
fun freeMarkerConfigurer() = FreeMarkerConfigurer().apply {
setTemplateLoaderPath("classpath:/templates")
}
}
Şeýle hem, haýsy bolsa-da ViewResolver
implementasiýasyny, aşakdaky mysalda görkezilişi ýaly baglanyşdyrmak mümkinçiligiňiz bar:
@Configuration
@EnableWebFlux
public class WebConfig implements WebFluxConfigurer {
@Override
public void configureViewResolvers(ViewResolverRegistry registry) {
ViewResolver resolver = ... ;
registry.viewResolver(resolver);
}
}
@Configuration
@EnableWebFlux
class WebConfig : WebFluxConfigurer {
override fun configureViewResolvers(registry: ViewResolverRegistry) {
val resolver: ViewResolver = ...
registry.viewResolver(resolver
}
}
Kontekstiň mazmunyny ylalaşmak we başga formatlary (HTML-dan başga) çözmek üçin goldaw bermek, HttpMessageWriterView
implementasiýasyna esaslanýan bir ýa-da birnäçe adaty görnüşleri sazlap bilersiňiz, onuň kodlawçysy spring-web
-den elýeterlidir. Aşakdaky mysalda görkezilýär:
@Configuration
@EnableWebFlux
public class WebConfig implements WebFluxConfigurer {
@Override
public void configureViewResolvers(ViewResolverRegistry registry) {
registry.freeMarker();
Jackson2JsonEncoder encoder = new Jackson2JsonEncoder();
registry.defaultViews(new HttpMessageWriterView(encoder));
}
// ...
}
@Configuration
@EnableWebFlux
class WebConfig : WebFluxConfigurer {
override fun configureViewResolvers(registry: ViewResolverRegistry) {
registry.freeMarker()
val encoder = Jackson2JsonEncoder()
registry.defaultViews(HttpMessageWriterView(encoder))
}
// ...
}
Statiki resurslar
Bu opsiýa Resource
esasynda statiki resurslary işlemek üçin amatly ýol berýär.
Aşakdaky mysalda, eger sorag /resources
bilen başlasa, sazlar üçin deňeşdirilen ýol /static
classpath-de ýerleşýän resurslary tapmagyň ýoludyr. Resurslar bir ýyl möhlet bilen işlenip, brauzeriň kesh-iň maksymal ulanylmagyny we HTTP-soraglaryň köp bolmazlygyny üpjün eder. Şeýle hem, Last-Modified
başlygy meýilnamalaşdyrylýar, eger bar bolsa, 304
status kody gaýtaralýar. Aşakdaky mysalda görkezilýär:
@Configuration
@EnableWebFlux
public class WebConfig implements WebFluxConfigurer {
@Override
public void addResourceHandlers(ResourceHandlerRegistry registry) {
registry.addResourceHandler("/resources/**")
.addResourceLocations("/public", "classpath:/static/")
.setCacheControl(CacheControl.maxAge(365, TimeUnit.DAYS));
}
}
@Configuration
@EnableWebFlux
class WebConfig : WebFluxConfigurer {
override fun addResourceHandlers(registry: ResourceHandlerRegistry) {
registry.addResourceHandler("/resources/**")
.addResourceLocations("/public", "classpath:/static/")
.setCacheControl(CacheControl.maxAge(365, TimeUnit.DAYS))
}
}
Resurs işleyjiler hem ResourceResolver
we ResourceTransformer
implementasiýalaryny ulanmak üçin araçägi goldaýar, optimizirlengen resurslar bilen işlemek üçin enjamlar toplumy bolmak mümkin.
VersionResourceResolver
-ni ulanyp resurs URL-lerini MD5 hash-a esaslanyp, app-ň üýtgemeýän wersiýasyna ýa-da başga maglumatlara esaslanyp ulanyp bilersiňiz. ContentVersionStrategy
(MD5 hash) has ygtybarly saýlaw bolmagy mümkin, emma käbir ýörite ýagdaýlar bar (meselem, JavaScript resurslar, modul ýükleýji bilen ulanylanda).
Aşakdaky mysalda VersionResourceResolver
-iň Java-konfigurasiýasynda nähili ulanylandygyny görýäris:
@Configuration
@EnableWebFlux
public class WebConfig implements WebFluxConfigurer {
@Override
public void addResourceHandlers(ResourceHandlerRegistry registry) {
registry.addResourceHandler("/resources/**")
.addResourceLocations("/public/")
.resourceChain(true)
.addResolver(new VersionResourceResolver().addContentVersionStrategy("/**"));
}
}
@Configuration
@EnableWebFlux
class WebConfig : WebFluxConfigurer {
override fun addResourceHandlers(registry: ResourceHandlerRegistry) {
registry.addResourceHandler("/resources/**")
.addResourceLocations("/public/")
.resourceChain(true)
.addResolver(VersionResourceResolver().addContentVersionStrategy("/**"))
}
}
ResourceUrlProvider
-i ulanmak mümkindir, bu URL-leri gaýtadan ýazmaga we çözgütçileriň we transformerleriň doly zynjyryny ulanmak (meselem, wersiýalary goşmak üçin) mümkinçiligini berýär. WebFlux konfigurasiýasy ResourceUrlProvider
bilen üpjün edip, beýleki bean-lara girizilip bilner.
Spring MVC-den tapawutlylykda, häzirki wagtda WebFlux-da statiki resurs URL-lerini geçiriji we transformer zynjyry arkaly we merkeziýatda ulanmak mümkinçiligi ýok, çünki blokirovka däl çözgütçileri we transformer ulanyp biljek presentasiýa tehnologiýasy ýok. Diňe lokal resurslar bilen işlenende, çözgütçileriň we transformerleriň ulanylyşy mümkin, bu ResourceUrlProvider
-i göni ulanmak (meselem, özbaşdak element arkaly) we bloklamak ugarynda mümkinçiligini berýär.
Üns beriň, eger hem EncodedResourceResolver
(meselem, Gzip, Brotli kodlamasynda) we VersionedResourceResolver
ulansaňyz, olaryň tertibini üns bilen saýlanyňyzda, kodlanylan faýlyň içerki mazmunyna temel berip wersiýalaryň hasaplanmagyny kepillendiriň.
WebJars hem WebJarsResourceResolver
bilen üpjün edilýär, bu awtomatiki usulda org.webjars:webjars-locator-core
biblioteka classpath-de bar bolan ýagdaýynda registririlýär. Çözgütçi URL-leri gaýtadan ýazmak mümkinçiligini berýär, jar wersiýasyny üstüne almak üçin, şeýle hem, inkoming URL-ler üçin gaýraü soňy tapawudy bilen deňeşdirme mümkinçiliklerini berýär - meselem, /jquery/jquery.min.js
-ni /jquery/1.2.0/jquery.min.js
bilen gaýtadan ýazyp bolýar.
ResourceHandlerRegistry
esasynda, doly sazlanyp bilinýän mümkinçilikler bilen üpjün edýär, meselem, soňky üýtgeşmeleriň hasabatyny, optimist resurs çözgütlerini ulanyp mümkin.
Ýol bilen deňeşdirmek
Ýol bilen deňeşdirmäge bagly bolan parametrleri sazlap bilersiňiz. Shakespeare javadoc-da PathMatchConfigurer
çalt serediň. Aşakdaky mysalda PathMatchConfigurer
nähili ulanylandygyny görýäris:
@Configuration
@EnableWebFlux
public class WebConfig implements WebFluxConfigurer {
@Override
public void configurePathMatch(PathMatchConfigurer configurer) {
configurer
.setUseCaseSensitiveMatch(true)
.setUseTrailingSlashMatch(false)
.addPathPrefix("/api",
HandlerTypePredicate.forAnnotation(RestController.class));
}
}
@Configuration
@EnableWebFlux
class WebConfig : WebFluxConfigurer {
@Override
fun configurePathMatch(configurer: PathMatchConfigurer) {
configurer
.setUseCaseSensitiveMatch(true)
.setUseTrailingSlashMatch(false)
.addPathPrefix("/api",
HandlerTypePredicate.forAnnotation(RestController::class.java))
}
}
Spring WebFlux sorag ýolunyň çözülen görnüşini ulanyp, RequestPath
görnüşinde hödürleýär, haýsy-da bolsa dekodirlenen ýol bölekleri muňdan aýrylýar (meselem, ýol ýa-da matrix üýtgeýji). Bu Spring MVC-den tapawutlylykda, sorag ýoluny dekodirlemek ýa-da nokta bilen aýrylan çäklendirmeleri aýyrmaly bolsaňyz, ýol bilen deňeşdirmək talap etmeýär.
Spring WebFlux, şeýle hem, Spring MVC-de bolşy ýaly, nusga bilen peseltilen deňeşdirmek mümkinçiligini hödürlemeýär, onuň ulanmagy ret etmek maslahat berilýär.
WebSocketService
WebFlux Java-konfigurasiýasynda WebSocketHandlerAdapter
bean yglan edilýär, bu WebSocket işleyjileri goldamak üçin üpjün edýär. Munyň manysy, WebSocket baglanyşygyňyüň soraýyş talabyny dolandyrmak üçin, WebSocket işleyjini URL bilen SimpleUrlHandlerMapping
arkaly deňeşdirmek gerek.
Käbir ýagdaýlarda WebSocketService
bilen üpjün edilen WebSocketHandlerAdapter
bean döretmek gerek bolup biler, haýsy-da bolsa WebSocket protokoluny dolandyrmak üçin şertleri sazlamaga mümkinçilik berýär. Mysal üçin:
@Configuration
@EnableWebFlux
public class WebConfig implements WebFluxConfigurer {
@Override
public WebSocketService getWebSocketService() {
TomcatRequestUpgradeStrategy strategy = new TomcatRequestUpgradeStrategy();
strategy.setMaxSessionIdleTimeout(0L);
return new HandshakeWebSocketService(strategy);
}
}
@Configuration
@EnableWebFlux
class WebConfig : WebFluxConfigurer {
@Override
fun webSocketService(): WebSocketService {
val strategy = TomcatRequestUpgradeStrategy().apply {
setMaxSessionIdleTimeout(0L)
}
return HandshakeWebSocketService(strategy)
}
}
Giňeldilen konfigurasiýa re modeimi
@EnableWebFlux
DelegatingWebFluxConfiguration
-i import edýär, haýsy-da bolsa:
-
WebFlux app-lar üçin adaty Spring konfigurasiýasyny üpjün edýär
-
WebFluxConfigurer
implementasiýalaryny barlap we olaryň ygtyýaryny bu konfigurasiýany sazlamaga berýär.
Giňeldilen re modeimde siz @EnableWebFlux
-i aýyryp, DelegatingWebFluxConfiguration
-dan göni giňeldip, WebFluxConfigurer
-i ýerine ýetirip programmany göni uzaldyp bilersiňiz, aşakdaky mysalda görkezilişi ýaly:
@Configuration
public class WebConfig extends DelegatingWebFluxConfiguration {
// ...
}
@Configuration
class WebConfig : DelegatingWebFluxConfiguration {
// ...
}
Siz bar bolan metodlary WebConfig
-da saklap bilersiňiz, emma häzirki wagtda bazasyndaky siniflerden bean yglanlarynyň üstüne ýazmak mümkinçiligi bar, we şonda-da classpath-de islendik sanly WebMvcConfigurer
beýleki implementasiýalarynyň bolmagyny saklap bilersiňiz.
HTTP/2
HTTP/2 Reactor Netty, Tomcat, Jetty we Undertow-da goldanylýar. Emma, server konfigurasiýasy bilen baglanyşykly käbir duýduryşlar bar, has giňişleýin maglumaty HTTP/2 wiki-sahypasynda tapyp bilersiňiz.
GO TO FULL VERSION