إضافة PropertySource خارجي مشروط في تطبيق تمهيد الربيع

0

أنا أستخدم حاليًا EnvironmentPostProcessor لإضافة PropertySource الخارجية ، يبدو الرمز كما يلي:

public class ExternalPropertySourceEnvironmentPostProcessor implements EnvironmentPostProcessor
{
    private static final String EXTERNAL_PROPERTY_SOURCE_NAME = "ExternalPropertySource";

    @Override
    public void postProcessEnvironment(ConfigurableEnvironment environment, SpringApplication application)
    {
        if (environment.acceptsProfiles(Profiles.EXTERNAL_PROPERTY_SOURCE_ENABLED_PROFILE)) {
            environment.getPropertySources()
                       .addLast(new ExternalPropertySource(EXTERNAL_PROPERTY_SOURCE_NAME, new ExternalSource()));
        }
    }
}

تستخدم Spring.factories أيضًا لتسجيل برنامج EnvironmentPostProcessor.

يعمل هذا الرمز بالفعل إذا تم تعيين ملف التعريف في متغيرات بيئة vm ، ولكن إذا تمت إضافته في src / main / resources / application.yml ، فلا يبدو أن ملف التعريف قد تم حقنه بعد في البيئة ولم يتم إرجاعه بواسطة environment.getActiveProfiles (). لقد حاولت استخدام الواجهة المرتبة بأسبقية ، لكنها لا تساعد.

لإضافة القليل من السياق حول ما أحاول تحقيقه ، هذه الفئة موجودة في مكتبة صغيرة تضيف مصدر خاصية خارجي مثل قاعدة بيانات. ثم يمكننا استخدامه في بعض تطبيقات التمهيد الربيعية الأخرى. شيء من هذا القبيل يفعله Spring Cloud Config.

أرغب في طريقة نظيفة لتمكين أو تعطيل مصدر الخاصية هذا اعتمادًا على البيئة التي يعمل بها الرمز. لا أمانع في استخدام شيء آخر ثم الملفات الشخصية أو حتى طريقة أخرى لحقن مصدر الملكية ، أريد فقط شيئًا نظيفًا لا يعتمد على عدة عوامل للعمل.

المشكلة الرئيسية في الكود الخاص بي الآن هي أنني أستخدم مصادر خصائص تمهيد الربيع لجعل مصدر ملكي الخاص قابل للتكوين.

حدث: لقد استخدمت تطبيق Spring Cloud لتصحيح هذا ، وكنت أخلط بين سياق التمهيد وسياق تمهيد الربيع العادي. انظر جوابي أدناه.

1 إجابة

1
افضل جواب

جعلني التحقيق الإضافي يكتشف أن المشكلة ظهرت فقط مع تطبيق Spring Cloud.

في الواقع ، تم تشغيل نقطة التوقف في هذا الرمز مرتين ، مرة بعد تهيئة سياق التمهيد ومرة واحدة بعد تهيئة سياق التمهيد الربيعي. كنت فقط تصحيح ملفات التعريف في الحدوث الأول. عند هذه النقطة ، يتم تحميل خصائص bootstrap.yml فقط وليس تلك الموجودة في ملف application.yml. من الواضح أن الحدث الثاني كان يحتوي على ملفات تعريف من ملف application.yml الخاص بي.

عملت الكود الخاص بي كما هو متوقع مع تطبيق Spring Boot Boot من الفانيليا. كما تنص الوثائق :

The Environment has already been prepared with all the usual property sources that Spring Boot loads by default.

لقد كنت مرتبكًا بسلوك تطبيقي الذي بدا مختلفًا عن ذلك البيان ، ولكن كان التمهيد الربيعي Cloud Cloud هو العبث في تصحيح الأخطاء.

نظرًا لأنني أحتاج إلى مصدر موقع يحتوي على أعلى أولوية ، أحتاج إلى إضافته في تهيئة ما بعد التمهيد لتطبيقات Spring Cloud. لقد استخدمت علامة init على برنامج EnvironmentPostProcessor الخاص بي حتى لا يتم تنفيذها مرتين واستخدمت ملف bootstrap.yml على تطبيقات Spring Cloud لتعيين الملف الشخصي.

TL ؛ DR: باستخدام Spring Cloud ، يتم استدعاء EnvironmentPostProcessor مرتين: مرة بعد تمهيد التمهيد ومرة أخرى بعد سياق سياق تمهيد الربيع العادي. إذا كنت بحاجة إلى خصائص تم حقنها وتستهدف تهيئة Bootstrap بعد Spring Cloud ، فاستخدم bootstrap.yml بدلاً من application.yml.

:مؤلف

أسئلة ذات صلة

فوق
قائمة طعام