JavaRush /Kurslar /All lectures for TK purposes /WebFlux Konfigurasiýasy

WebFlux Konfigurasiýasy

All lectures for TK purposes
Dereje , Sapak
Elýeterli

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:

Java
@Configuration
@EnableWebFlux
public class WebConfig {
}
Kotlin
@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:

Java
@Configuration
@EnableWebFlux
public class WebConfig implements WebFluxConfigurer {
// Konfigurasiýanyň metodlaryny durmuşa geçirýäris...
}
Kotlin
@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ň:

Java
@Configuration
@EnableWebFlux
public class WebConfig implements WebFluxConfigurer {
@Override
public void addFormatters(FormatterRegistry registry) {
// ...
}
}
Kotlin
@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:

Java
@Configuration
@EnableWebFlux
public class WebConfig implements WebFluxConfigurer {
@Override
public void addFormatters(FormatterRegistry registry) {
DateTimeFormatterRegistrar registrar = new DateTimeFormatterRegistrar();
registrar.setUseIsoFormat(true);
registrar.registerFormatters(registry);
}
}
Kotlin
@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:

Java
@Configuration
@EnableWebFlux
public class WebConfig implements WebFluxConfigurer {
@Override
public Validator getValidator() {
// ...
}
}
Kotlin
@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:

Java
@Controller
public class MyController {
@InitBinder
protected void initBinder(WebDataBinder binder) {
binder.addValidators(new FooValidator());
}
}
Kotlin
@Controller
class MyController {
@InitBinder
protected fun initBinder(binder: WebDataBinder) {
binder.addValidators(FooValidator())
}
}
Eger 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:

Java
@Configuration
@EnableWebFlux
public class WebConfig implements WebFluxConfigurer {
@Override
public void configureContentTypeResolver(RequestedContentTypeResolverBuilder builder) {
// ...
}
}
Kotlin
@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:

Java
@Configuration
@EnableWebFlux
public class WebConfig implements WebFluxConfigurer {
@Override
public void configureHttpMessageCodecs(ServerCodecConfigurer configurer) {
configurer.defaultCodecs().maxInMemorySize(512 * 1024);
}
}
Kotlin
@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:

Şeýle hem, classpath-de tapylan halatynda awtomatiki ýagdaýda aşakdaky bellige alnan modullar hasaba alynýar:

Prezentasiýa Tanama

Näme üçin sazlamak mümkinçiligi goýuldy.

Java
@Configuration
@EnableWebFlux
public class WebConfig implements WebFluxConfigurer {
@Override
public void configureViewResolvers(ViewResolverRegistry registry) {
// ...
}
}
Kotlin
@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):

Java
@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;
}
}
Kotlin
@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:

Java
@Configuration
@EnableWebFlux
public class WebConfig implements WebFluxConfigurer {
@Override
public void configureViewResolvers(ViewResolverRegistry registry) {
ViewResolver resolver = ... ;
registry.viewResolver(resolver);
}
}
Kotlin
@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:

Java
@Configuration
@EnableWebFlux
public class WebConfig implements WebFluxConfigurer {
@Override
public void configureViewResolvers(ViewResolverRegistry registry) {
registry.freeMarker();
Jackson2JsonEncoder encoder = new Jackson2JsonEncoder();
registry.defaultViews(new HttpMessageWriterView(encoder));
}
// ...
}
Kotlin
@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:

Java
@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));
}
}
Kotlin
@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:

Java
@Configuration
@EnableWebFlux
public class WebConfig implements WebFluxConfigurer {
@Override
public void addResourceHandlers(ResourceHandlerRegistry registry) {
registry.addResourceHandler("/resources/**")
        .addResourceLocations("/public/")
        .resourceChain(true)
        .addResolver(new VersionResourceResolver().addContentVersionStrategy("/**"));
}
}
Kotlin
@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.

Java-konfigurasiýasy 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:

Java
@Configuration
@EnableWebFlux
public class WebConfig implements WebFluxConfigurer {
@Override
public void configurePathMatch(PathMatchConfigurer configurer) {
configurer
    .setUseCaseSensitiveMatch(true)
    .setUseTrailingSlashMatch(false)
    .addPathPrefix("/api",
            HandlerTypePredicate.forAnnotation(RestController.class));
}
}
Kotlin
@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:

Java
@Configuration
@EnableWebFlux
public class WebConfig implements WebFluxConfigurer {
@Override
public WebSocketService getWebSocketService() {
TomcatRequestUpgradeStrategy strategy = new TomcatRequestUpgradeStrategy();
strategy.setMaxSessionIdleTimeout(0L);
return new HandshakeWebSocketService(strategy);
}
}
Kotlin
@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:

Java
@Configuration
public class WebConfig extends DelegatingWebFluxConfiguration {
// ...
}
Kotlin
@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.

Teswirler
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION