JavaRush /Kurslar /All lectures for UZ purposes /WebFlux Konfiguratsiyasi

WebFlux Konfiguratsiyasi

All lectures for UZ purposes
Daraja, Dars
Mavjud

Java-konfiguratsiya WebFlux so'rovlarni ishlov berish uchun zarur komponentlarni aniqlaydi, annotatsiyalangan kontrollerlar yoki funksional end-nuqtalar yordamida va konfiguratsiyani sozlash uchun API-ni taqdim etadi. Bu sizga Java-konfiguratsiya orqali yaratilgan asosiy binlarni tushunishga ehtiyoj qolmaydi.

Agar kengaytirilgan sozlamalar kerak bo'lsa, bu konfiguratsion API-da mavjud emas, siz kengaytirilgan konfiguratsiya rejimidan foydalangan holda konfiguratsiya ustidan to'liq nazorat olish imkoniga ega bo'lasiz.

WebFlux Konfiguratsiyasini Faollashtirish

Java-konfiguratsiyada @EnableWebFlux annotatsiyasidan foydalanishingiz mumkin, quyidagi misolda ko'rsatilganidek:

Java
@Configuration
@EnableWebFlux
public class WebConfig {
}
Kotlin
@Configuration
@EnableWebFlux
class WebConfig

Oldingi misolda bir qator Spring WebFlux infratuzilma binlari registratsiya qilinadi va classpath-da mavjud bo'lgan bog'liqliklarga moslanadi – JSON, XML va boshqa formatlar uchun.

WebFlux Konfiguratsiya API

Java-konfiguratsiyangizda WebFluxConfigurer interfeysini amalga oshirishingiz mumkin, quyidagi misolda ko'rsatilganidek:

Java
@Configuration
@EnableWebFlux
public class WebConfig implements WebFluxConfigurer {
// Konfiguratsiya metodlarini amalga oshiramiz...
}
Kotlin
@Configuration
@EnableWebFlux
class WebConfig : WebFluxConfigurer {
// Konfiguratsiya metodlarini amalga oshiramiz...
}

Parchalash, formatlash

Standart bo'yicha turli raqam va sanalar turlari uchun formatterlar o'rnatilgan, @NumberFormat va @DateTimeFormat orqali moslashtirishni qo'llab-quvvatlaydigan vositalar bilan birgalikda.

Java-konfiguratsiyangizda maxsus formatterlar va konverterlarni registratsiya qilish uchun quyidagidan foydalaning:

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) {
// ...
}
}

Standart bo'yicha Spring WebFlux so'rovni tahlil qilinganda va sanalar qiymatlarini formatlaganda so'rovning mintaqaviy sozlamalarini inobatga oladi. Bu formalar uchun amal qiladi, bu yerda sanalar formalar uchun "input" maydonlari sifatida ixtiyoriy ko'rinishda taqdim etiladi. Lekin formalar uchun "date" va "time" maydonlari, brauzerlar HTML spetsifikatsiyasi bilan aniqlangan o'zgarmas formatdan foydalanadilar. Bu hollarda sanalar va vaqtlarni formatlash quyidagicha sozlanadi:

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)
}
}

Validatsiya

Standart bo'yicha, agar classpath-da Bean Validation (masalan, Hibernate Validator) mavjud bo'lsa, LocalValidatorFactoryBean global validator sifatida @Valid annotatsiyasi bilan foydalanish uchun ro'yxatdan o'tkaziladi va metod argumentlarida Validated xususiyatlari mavjud bo'ladi.

Java-konfiguratsiyangizda global Validator nusxasini sozlash mumkin, quyidagi misolda ko'rsatilganidek:

Java
@Configuration
@EnableWebFlux
public class WebConfig implements WebFluxConfigurer {
@Override
public Validator getValidator() {
// ...
}
}
Kotlin
@Configuration
@EnableWebFlux
class WebConfig : WebFluxConfigurer {
override fun getValidator(): Validator {
// ...
}
}

Shuni inobatga olingki, Validator ning mahalliy realizatsiyalarini ham registratsiya qilish mumkin, quyidagi misolda ko'rsatilganidek:

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())
}
}
Agar LocalValidatorFactoryBean biror joyga kiritilishi kerak bo'lsa, bir binni yarating va uni @Primary annotatsiya bilan belgilab, MVC konfiguratsiyada e'lon qilingan bilan kelishmovchilikdan qoching.

Mazmun turlarini tan oluvchi vositalar

Spring WebFlux yordamida so'rovdan @Controller uchun ma'lumotlar uzatish muhitining so'ralgan turlarini qanday belgilash usulini sozlashingiz mumkin. Standart bo'yicha faqat Accept tegi tekshiriladi, lekin siz ham so'rov parametrlariga asoslangan strategiyani faollashtirishingiz mumkin.

Quyidagi misolda, so'ralgan mazmun turini aniqlash qanday qilib sozlanishi mumkinligini ko'rsatadi:

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) {
// ...
}
}

Protokol orqali uzatiladigan xabarlarni kodlash

Quyidagi misolda, so'rov va javobni tanlash va yozishni qanday sozlash ko'rsatilgan:

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 asosiy o'qiydiganlar va yozuvchilar to'plamini taqdim etadi. Uni qo'shimcha o'qiydiganlar va yozuvchilar qo'shish, standartlarni sozlash yoki mutlaqo almashtirish uchun ishlatishingiz mumkin.

Jackson JSON va XML uchun Jackson2ObjectMapperBuilder dan foydalanishni ko'rib chiqishingiz mumkin, bu Jackson kutubxonasi xususiyatlarini quyidagicha sozlaydi:

Shuningdek, quyidagi taniqli modullar avtomatik ravishda registratsiya qilinadi, agar ular classpath da aniqlansa:

Ko'rinishni tan oluvchi vositalar

Quyidagi misolda, ko'rinishni tan olishni qanday sozlash ko'rsatilgan:

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 bilan integretsiyalangan ko'rinish texnologiyalari uchun qisqartmalarni o'z ichiga oladi. Quyidagi misolda FreeMarker dan foydalanilgan (bu esa FreeMarker ko'rinish texnologiyasini asosiy sozlashni ham talab qiladi):

Java
@Configuration
@EnableWebFlux
public class WebConfig implements WebFluxConfigurer {
@Override
public void configureViewResolvers(ViewResolverRegistry registry) {
registry.freeMarker();
}
// FreeMarker ni konfiguratsiya qilamiz...
@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 ni konfiguratsiya qilamiz...
@Bean
fun freeMarkerConfigurer() = FreeMarkerConfigurer().apply {
setTemplateLoaderPath("classpath:/templates")
}
}

Shuningdek, har qanday ViewResolver realizatsiyani ulash mumkin, quyidagi misolda ko'rsatilganidek:

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
}
}

Kontent moslashuvini qo'llab-quvvatlashni boshqa formatlar orqali ko'rinishlar yordamida amalga oshirish uchun (HTML dan tashqari), HttpMessageWriterView asosidagi bir yoki bir nechta default ko'rinishlarni konfiguratsiya qilishingiz mumkin, bu spring-web dan har qanday mavjud kodni qabul qiladi. Quyidagi misolda buni qanday qilish ko'rsatilgan:

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))
}
// ...
}

Statik resurslar

Bu parametr Resource asosidagi joylashuvlardan statik resurslarni ishlashni qulay usulda taqdim etadi.

Quyidagi misolda, agar so'rov /resources bilan boshlansa, nisbiy yo'l yordamida classpath-dagi /static ga nisbatan statik resurslarni izlash va ishlash amalga oshiriladi. Resurslar bir yil muddatli amal qilish bilan ishlanadi, brauzer keshidan maksimal foydalanuvchi erishiladi va brauzer tomonidan amalga oshiriladigan HTTP-so'rovlar soni qisqartiriladi. Shuningdek, Last-Modified tegi hisoblanadi va mavjud bo'lsa, 304 holat kodi qaytariladi. Quyidagi daftar misoli ko'rsatilgan:

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))
}
}

Resurslar ishlov beruvchisi ResourceResolver va ResourceTransformer realizatsiyalari zanjirini qo'llab-quvvatlaydi, bu esa optimallashgan resurslar bilan ishlash uchun vositalarni yaratishga qaratilgan.

VersionResourceResolver dan foydalanib resurs URL-manzillarini MD5 xeshiga asoslangan versiyalar bilan qayta yozishingiz mumkin. ContentVersionStrategy (MD5 xeshi) to'g'ri tanlov bo'ladi, lekin ba'zi sezilarli istisnolar bilan (masalan, modul yuklovchi bilan ishlatiladigan JavaScript resurslari).

Quyidagi misolda VersionResourceResolver dan Java konfiguratsiyasida qanday foydalanish ko'rsatilgan:

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 dan foydalanib URL-manzillarni qayta yozish va to'liq tanishuvlar va o'zgartiruvchilar zanjirini (masalan, versiyalarni joylashtirish uchun) qo'llash mumkin. WebFlux konfiguratsiyasi ResourceUrlProvider ni taqdim etadi, uni boshqa binlar ichiga kiritishingiz mumkin.

Spring MVC dan farqli o'laroq, WebFlux da statik resurslar URL-manzillarini avtomatik qayta yozish imkoniyati mavjud emas, chunki hech qanday ko'rinish texnologiyalari yanada bloklanmagan zanjir va tanishuvlarni qo'llay olmaydi. Mahalliy resurslar bilan ishlashda yechim "ResourceUrlProvider" ni to'g'ridan-to'g'ri (masalan, maxsus element yordamida) ishlatish va bloklash hisoblanadi.

Shuni unutmangki, agar EncodedResourceResolver (masalan, Gzip, Brotli kodlash bilan) va VersionedResourceResolver ni ishlatilsa, ularni shunday tartibda ro'yxatdan o'tkazish kerakki, bu holda o'zgarmas fayl asosida ishonchli versiyalarni hisoblash mumkin.

WebJars ham WebJarsResourceResolver yordamida qo'llab-quvvatlanadi, bu org.webjars:webjars-locator-core kutubxonasi classpath da mavjud bo'lsa avtomatik ravishda ro'yxatdan o'tadi. Resurs qidiruvsi URL-manzillarni qayta yozishi mumkin, jar versiyalarini o'z ichiga qamrab olishi bilan birga, kiruvchi URL-manzillarni versiyasiz moslashtirishi mumkin - masalan, /jquery/jquery.min.js dan /jquery/1.2.0/jquery.min.js ga.

ResourceHandlerRegistry asoslangan Java-konfiguratsiya qo'shimcha nozik nazorat imkoniyatlarini, masalan, oxirgi o'zgarish vaqtida ishlash logikasi va optimallashtirilgan resurs tan olishni taqdim etadi.

Yo'lni moslash

Yo'lni moslash bilan bog'liq parametrlarni sozlashingiz mumkin. Alohida parametrlar haqida batafsil ma'lumotni PathMatchConfigurer javadoc da qarang. Quyidagi misolda PathMatchConfigurer dan qanday foydalanish ko'rsatilgan:

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 so'rovi yo'lining RequestPath nomli parsirlangan ko'rinishidan foydalanadi, bu yo'l segmentlarining dekodlangan qiymatlariga kirish imkonini beradi, nuqta bilan ajratilgan kontent o'chirilgan (masalan, yo'l o'zgaruvchilari yoki matriks o'zgaruvchilari). Bu Spring MVC dan farqli o'laroq, yo'l so'rovini dekodlash yoki nuqta bilan ajratilgan kontentni o'chirishni ko'rsatishga ehtiyoj yo'q.

Spring WebFlux shuningdek Spring MVC dan farqli o'laroq "suffix" moslamasini qo'llab-quvvatlamaydi, biz ham buni ishlatmaslikni tavsiya qilamiz.

WebSocketService

Java-konfiguratsiyada WebFlux WebSocketHandlerAdapter ni e'lon qiladi, bu WebSocket ishlov beruvchilarini chaqirishni qo'llab-quvvatlaydi. Bu WebSocket protokoli orqali ulanishni tasdiqlash uchun so'rovni ishlatish uchun faqat URL-manzilga WebSocketHandler ni SimpleUrlHandlerMapping orqali moslash kerak.

Ba'zi hollarda WebSocket protokoli bilan ishlayotgan server xususiyatlarini sozlash uchun imkon beruvchi WebSocketService bilan ta'minlanadigan WebSocketHandlerAdapter bin yaratish kerak bo'lishi mumkin. Masalan, quyidagi:

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)
}
}

Kengaytirilgan Konfiguratsiya Rejimi

@EnableWebFlux DelegatingWebFluxConfiguration ni import qiladi, u:

  • WebFlux ilovalari uchun Spring standart konfiguratsiyasini uzatadi

  • bu konfiguratsiyani sozlash uchun WebFluxConfigurer ning amalga oshiruvchi vakolatlarini aniqlaydi va topshiradi.

Kengaytirilgan rejimda siz @EnableWebFlux annotatsiyasini olib tashlashingiz va WebFluxConfigurer ni amalga oshirish o'rniga to'g'ridan-to'g'ri DelegatingWebFluxConfiguration dan kengaytirishingiz mumkin, quyidagi misolda ko'rsatilganidek:

Java
@Configuration
public class WebConfig extends DelegatingWebFluxConfiguration {
// ...
}
Kotlin
@Configuration
class WebConfig : DelegatingWebFluxConfiguration {
// ...
}

WebConfig da mavjud metodlarni saqlab qolishingiz mumkin, lekin endi asosiy klassdan bin e'lon qilishlarni boʻlish imkoniyatiga ega boʻlasiz, va hali ham boshqa WebMvcConfigurer ning classpath da har qanday miqdorda bajarilishiga ruxsat berilishi mumkin.

HTTP/2

HTTP/2 Reactor Netty, Tomcat, Jetty va Undertow da qo'llab-quvvatlanadi. Ammo server konfiguratsiyasi bilan bog'liq muayyan ogohlantirishlar mavjud. Qo'shimcha ma'lumotni HTTP/2 bo'yicha wiki sahifasida topishingiz mumkin.

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