سؤال

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

public interface ExternalService {
// ...
}

@Service
public class ExternalServiceImpl implements ExternalService {
// ...
}

@Service
@Primary
@Profile({"stub"})
public class StubExternalService implements ExternalService {
// ...
}

...وهذا يعمل بشكل رائع:إذا لم يكن ملف تعريف كعب الروتين موجودًا، فلن يتم تحميل حبة كعب الروتين على الإطلاق.إذا كان موجودًا، فإنه يحل محل التنفيذ الحقيقي بشكل جيد بسبب التعليق التوضيحي @Primary.

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

ما زلت أرغب في إنشاء خدمة كعب الروتين لاستبدالهما معًا، ولكن هذه المرة طريقتي القديمة في تعريف كعب الروتين كـ @Primary لا تعمل، نظرًا لوجود تطبيق أساسي واحد بالفعل.ما أحتاجه بشكل أساسي هو طريقة لعدم تحميل الحبة الأساسية عند تعيين ملف تعريف كعب الروتين، لكنني لا أعرف كيفية القيام بذلك بالضبط.يبدو أن عمليات البحث على الويب أو أسئلة Stack Overflow الأخرى لا تساعد.

هل كانت مفيدة؟

المحلول

تبين أن الإجابة كانت بسيطة بشكل مدهش:قمت بإضافة غير عامل (!) أمام اسم الملف الشخصي:

@Service
@Primary
@Profile({"!stub"})
public class ExternalServiceImpl implements ExternalService {
// ...
}

بهذه الطريقة يتم تحميل الحبة فقط عندما stub-الملف الشخصي غير نشط.تمت إضافة الدعم لهذه الميزة في الربيع 3.2 م1.

هناك تحذير واحد، رغم ذلك:إذا كتبت @Profile({"!stub", "foo"}), ، يتم التعامل مع الفاصلة على أنها "أو"، وليس "و".لذلك سيتم تفعيل هذا المثال للفاصوليا إما إذا stub لم تكن نشطة أو إذا foo كان نشطا.

تعديل/إضافة: أضاف Spring 5.1 دعمًا لـ a لغة تعبير جديدة للملفات الشخصية: !stub & foo يتم تفعيله عندما stub غير نشط و foo نشط.نجاح عظيم!يمكنك أيضًا المزج والمطابقة بين حروف and وors بشرط استخدام الأقواس: production & (us-east | eu-central).

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top