سؤال

لا بد لي من استخدام 3 مديري معاملات مختلفة في الويب الخاص بي. لذلك كتبت التعليق التوضيحي الخاص بي وفقًا لـ مرجع الربيع (القسم 10.5.6.3 شرح اختصار مخصص).

يبدو هذا التعليقات التوضيحية (لاستخدام معاملة واحدة محددة) هكذا:

import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

import org.springframework.transaction.annotation.Transactional;

@Target({ElementType.METHOD, ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Transactional("customer")
public @interface CustomerTX{


}

كل شيء يعمل بشكل جيد عند شرح طبقة الخدمة الخاصة بي مع شرح Customertx المخصص. لكن يجب أن أقدم المزيد من الخيارات للتعليق التوضيحي الخاص بي ، مثل ReadOnly = True ، Rollbackfor = وما إلى ذلك. نظرًا لأنه لا يمكنك "تمديد" التعليق التوضيحي (أحتاج حقًا إلى تمديد التعليق التوضيحي transactional من الربيع) ، ما هو التنفيذ الصحيح لهذا؟

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

المحلول

سيتعين عليك إنشاء العديد من التعليقات التوضيحية المخصصة ، أخشى ، واحدة لكل حالة استخدام ، توضيح كل منها مع الدقة @Transactional التعليقات التوضيحية التي تحتاجها.

أو سيتعين عليك كتابة الجانب الخاص بك في SideJ (تمتد org.springframework.transaction.aspectj.AbstractTransactionAspect من Spring-aspects.jar) إلى إنشاء منطق المعاملة الخاص بك.

نصائح أخرى

في ربيع 4 يمكنك فعل ذلك. كما ذكر في توثيق

يمكن أيضًا دمج عمليات التعريف الوصفية لإنشاء تعليقات توضيحية مؤلفة. على سبيل المثال ، يتكون شرح RestController من Spring MVC من Controller و @ResponseBody.

بالإضافة إلى ذلك ، قد تعيد التعليقات التوضيحية المؤلفة اختياريًا سمات من عمليات التعريف للسماح بتخصيص المستخدم. يمكن أن يكون هذا مفيدًا بشكل خاص عندما تريد فقط فضح مجموعة فرعية من سمات meta-annotation. على سبيل المثال ، يقوم SPRING's SessionsCope Stenotation بترميز اسم النطاق إلى الجلسة ولكنه لا يزال يسمح بتخصيص Proxymode.

@Target({ElementType.TYPE, ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Scope(WebApplicationContext.SCOPE_SESSION)
public @interface SessionScope {

    /**
     * Alias for {@link Scope#proxyMode}.
     * <p>Defaults to {@link ScopedProxyMode#TARGET_CLASS}.
     */
    @AliasFor(annotation = Scope.class)
    ScopedProxyMode proxyMode() default ScopedProxyMode.TARGET_CLASS;

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