Выберите EJB для инъекции без перекомпиляции - PullRequest
3 голосов
/ 28 октября 2011

Представьте, что у вас есть две реализации @Local интерфейса

@Local
public interface LocalInterface {
}

@Stateless
public class MyFirstImplementation implements LocalInterface {
}

@Stateless
public class MySecondImplementation implements LocalInterface {
}

И я хочу выбрать без перекомпиляции проекта (то есть во время выполнения или с использованием внешней конфигурациисвойство) какой (MyFirstImplementation или MySecondImplementation) я хочу использовать.

public class MyClass {
   @EJB
   LocalInterface local;
}

После того, как выбрана одна реализация, ее не нужно менять.Я использую JBoss 5.1, если это поможет.

Ответы [ 3 ]

2 голосов
/ 28 октября 2011

Другой подход состоит в том, чтобы найти ссылку на EJB с JNDI вместо того, чтобы полагаться на автоматическую инъекцию, на случай, если это может помочь кому-либо еще:

public class MyClass {
   LocalInterface local;

   @PostConstruct
   public void init() {
       local = findImplementation();
   }

   private LocalInterface findImplementation() {
       try {
            InitialContext context = new InitialContext();
            String ejbPath = // read from an external property
            return (LocalInterface) context.lookup(ejbPath);
       } catch ... { ... }
   }
}

Это то, что я наконец-то сделал, потому что с JBoss 5 (@Produces. Я считаю ответ ПедроКовальского принятым в качестве аннотаций CDI, кажется лучшим решением, если у вас нет других ограничений.

2 голосов
/ 28 октября 2011

Вы можете достичь этого, используя дескриптор развертывания - ejb-jar.xml .Примерно так (может быть не на 100% точно, но я думаю, что вы поняли):

<ejb-jar> 
   <enterprise-beans>
      <session>
         <ejb-name>MyClass</ejb-name>
         <ejb-ref>
            <ejb-ref-name>ejb/myLocalReferencedBean</ejb-ref-name>
            <ejb-ref-type>Session</ejb-ref-type>
            <local>com.yourpackage.LocalInterface</local>
            <ejb-link>MyFirstImplementation</ejb-link>
            <injection-target>local</injection-target>
         </ejb-ref>
      </session>

      <session>
         <ejb-name>MyFirstImplementation</ejb-name>
         <!-- ... -->
      </session>
      <session>
         <ejb-name>MySecondImplementation</ejb-name>
         <!-- ... -->
      </session>
   </enterprise-beans>
</ejb-jar>

Другой способ - использовать CDI, как описано здесь: Inject @EJB на основе beanна условиях

1 голос
/ 28 октября 2011

Метод, описанный PedroKowalski, является типичным способом сделать это.Еще один трюк в отношении «свойства внешней конфигурации» - это простая настройка вашего компоновщика таким образом, чтобы в генерируемом вами jar-файле, содержащем EJB, находилась только одна реализация.

Так что вам не нужно перекомпилировать классы илиизмените любой исходный код, но вам нужно пересобрать свой jar-файл, чтобы выбрать другую реализацию.

...