كيف يمكنني تجاوز طريقة وحدة جلسة EJB 3 باستخدام وسيطة عامة - إن أمكن على الإطلاق؟[مغلق]

StackOverflow https://stackoverflow.com/questions/14801

سؤال

لنفترض أن لديك واجهات/فئات EJB 3 التالية:

public interface Repository<E>
{
   public void delete(E entity);
}

public abstract class AbstractRepository<E>  implements Repository<E>
{
   public void delete(E entity){
      //...
   }
}

public interface FooRepository<Foo>
{
   //other methods
}

@Local(FooRepository.class)
@Stateless
public class FooRepositoryImpl extends
    AbstractRepository<Foo> implements FooRepository
{
   @Override
   public void delete(Foo entity){
      //do something before deleting the entity
      super.delete(entity);
   }
   //other methods
}

ثم حبة أخرى تصل إلى FooRepository فاصوليا :

//...
@EJB
private FooRepository fooRepository;

public void someMethod(Foo foo)
{
    fooRepository.delete(foo);
}
//...

ومع ذلك، لا يتم تنفيذ طريقة التجاوز مطلقًا عندما تكون طريقة الحذف الخاصة بـ FooRepository يسمى الفول .بدلاً من ذلك، يتم فقط تنفيذ أسلوب الحذف المحدد في AbstractRepository يتم تنفيذ.

ما الخطأ الذي أفعله أم أنه مجرد قيود على Java/EJB 3 بحيث لا تعمل الأدوية العامة والميراث معًا بشكل جيد حتى الآن؟

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

المحلول

لقد جربته مع بوجو ويبدو أنه يعمل.اضطررت إلى تعديل التعليمات البرمجية الخاصة بك قليلاً.أعتقد أن واجهاتك كانت معطلة بعض الشيء، لكنني لست متأكدًا.

لقد افترضت أن "Foo" كان نوعًا ملموسًا، ولكن إذا لم يكن الأمر كذلك، فيمكنني إجراء المزيد من الاختبارات لك.

لقد كتبت للتو طريقة رئيسية لاختبار ذلك.آمل أن يساعد هذا!

public static void main(String[] args){
        FooRepository fooRepository = new FooRepositoryImpl();
        fooRepository.delete(new Foo("Bar"));
}

public class Foo
{
    private String value;

    public Foo(String inValue){
        super();
        value = inValue;
    }
    public String toString(){
        return value;
    }
}

public interface Repository<E>
{
    public void delete(E entity);
}

public interface FooRepository extends Repository<Foo>
{
    //other methods
}

public class AbstractRespository<E> implements Repository<E>
{
    public void delete(E entity){
        System.out.println("Delete-" + entity.toString());
    }
}

public class FooRepositoryImpl extends AbstractRespository<Foo> implements FooRepository
{
     @Override
       public void delete(Foo entity){
          //do something before deleting the entity
            System.out.println("something before");
          super.delete(entity);
       }
}

نصائح أخرى

هل يمكنك كتابة اختبار وحدة مقابل فئة FooRepository الخاصة بك فقط باستخدامها كـ POJO.إذا كان ذلك يعمل كما هو متوقع، فأنا لست على دراية بأي سبب يجعله يعمل بشكل مختلف داخل الحاوية.

أظن أن هناك شيئًا آخر يحدث وربما يكون من الأسهل تصحيحه إذا قمت باختباره باعتباره POJO.

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