حقن كائن فارغ في المُنشئ باستخدام @ConfigurationProperties في SpringBoot 3.3.6
تعتبر ترقية البيئات البرمجية أحد التحديات التي يواجهها المطورون، خاصة عند الانتقال من إصدار قديم إلى أحدث. في حالة Java مع Spring Boot، قد تظهر بعض المشاكل نتيجة للتغييرات في كيفية إدارة الخصائص والتكوينات. سنتناول في هذا المقال مشكلة حقن كائن فارغ في المُنشئ عند استخدام @ConfigurationProperties في الإصدار 3.3.6 من Spring Boot.
مشكلة حقن الكائنات مع @ConfigurationProperties
عند الترقية من إصدار 2.7.x إلى 3.3.6 من Spring Boot، واجهت بعض التطبيقات مشكلة في عمليات الاختبار باستخدام ApplicationContextRunner
. كانت المشكلة تتعلق بكائن KafkaPropertiesWrapper
الذي يتم حقنه ولكن يظهر كائن Null عند محاولة استخدامه في المُنشئ. هذا النوع من المشاكل يمكن أن يعوق تطوير التطبيقات ويؤدي إلى إهدار الوقت في التصحيح والتحليل.
كيفية معالجة المشكلة
المسألة تكمن في تغيير الطريقة التي يتم بها تحميل @ConfigurationProperties في الإصدار 3.x. بينما كان يعمل بشكل سليم في الإصدار 2.7.x، إلا أن النتيجة في الإصدار الجديد تكون مختلفة. تم استخدام الكود التالي كمثال لتوضيح المشكلة:
@Getter
@ConfigurationProperties(prefix = "spring.kafka")
public class KafkaPropertiesWrapper {
private final KafkaProperties kafkaProperties;
public KafkaPropertiesWrapper(KafkaProperties kafkaProperties) {
this.kafkaProperties = kafkaProperties;
}
}
@Getter
public class AnotherWrapper {
private final KafkaProperties kafkaProperties;
public AnotherWrapper(KafkaProperties kafkaProperties) {
this.kafkaProperties = kafkaProperties;
}
}
class KafkaWrapperTest {
@EnableConfigurationProperties({KafkaPropertiesWrapper.class, KafkaProperties.class})
static class TrivialConfiguration {
@Bean
AnotherWrapper anotherWrapper(KafkaProperties kafkaProperties) {
return new AnotherWrapper(kafkaProperties);
}
}
private ApplicationContextRunner contextRunner = new ApplicationContextRunner()
.withUserConfiguration(TrivialConfiguration.class);
@Test
void beginOk() {
contextRunner.run(context -> {
assertThat(context).hasSingleBean(KafkaProperties.class);
assertThat(context).hasSingleBean(KafkaPropertiesWrapper.class);
KafkaPropertiesWrapper kafkaPropertiesWrapper = context.getBean(KafkaPropertiesWrapper.class);
assertThat(kafkaPropertiesWrapper.getKafkaProperties()).isNotNull();
});
}
}
هنا، نلاحظ أنه عند استدعاء kafkaPropertiesWrapper.getKafkaProperties()
، يتم اعتراض كائن Null. وهذا يتطلب اتخاذ بعض الإجراءات لضمان أن يتم تحميل الخصائص بشكل سليم.
التغييرات المطلوبة
لتجنب هذه المشكلة، يجب مراجعة ماهية الخصائص المعلقة وكيفية تحميلها في الإصدار الأخير. من المهم الاطلاع على مستندات الترقية الخاصة بإصدار Spring Boot والتأكد من أن جميع الخصائص الضرورية مُعبأة بشكل صحيح. في الإصدار 3.x، قد يتطلب الأمر تغيير بعض طرق التحميل أو كيفية تعريف Beans بشكل يتماشى مع الأساليب الجديدة.
استنتاج
ترقية تطبيقات Spring Boot تحتاج إلى الانتباه لتغييرات مفصلية قد تؤثر على الوظائف الأساسية. مشكلة حقن كائن Null في المُنشئ عبر @ConfigurationProperties يمكن أن تكون محبطة ولكنها تتيح فرصة لتحسين الكود وفهم أعمق لكيفية عمل Spring Boot. يجب على المطورين أن يكونوا دوماً على دراية بجديد التحديثات والممارسات الجيدة لتفادي هذه العقبات.
من خلال الفهم الجيد للتغييرات التي طرأت على @ConfigurationProperties في الإصدار 3.3.6، يمكن تجاوز هذه المشاكل والعمل على تطوير تطبيقات أكثر قوة وكفاءة.