2010-07-07 2 views
11

Я хочу, чтобы написать этот кусок кода:Внедрение статического EJB, вздор?

@Stateless 
public class MyEjb 
{ 
    @EJB 
    private static MyOtherEjbWhichIWantStatic myOtherEjb; 
} 

Это имеет смысл для меня, что я хочу, чтобы ввести в EJB в моем классе, как статический элемент, для различных причин.

Java не очень доволен тем, что, к сожалению

com.sun.enterprise.container.common.spi.util.InjectionException: Illegal use of static field private static MyOtherEjbWhichIWantStatic myOtherEjb on class that only supports instance-based injection 

Я не понимаю, почему я не могу вводить статическое EJB в другую EJB?

ответ

26

Как другие отметили, это не допускается спецификацией, а короткая версия, что @EJB аннотацию поддерживаются только для статических членов в классах с main() функции (см спецификации EJB 3.0 и контейнер клиента приложения).

Почему это так? Прежде всего, статические поля чтения/записи полностью запрещены в EJB (это часть ограничения EJB).От Why can't I use nonfinal static fields in my enterprise bean?

Nonfinal поля статического класса запрещены в EJBs, потому что такие поля сделать корпоративный компонент трудно или невозможно распределить. Поля статических классов распределяются между всеми экземплярами определенного класса, но только внутри одной виртуальной машины Java (JVM). Обновление поля статического класса подразумевает намерение разделить значение поля между всеми экземплярами класса. Но если класс работает в нескольких JVM одновременно, только те экземпляры, которые работают в одной JVM как экземпляр обновления, будут иметь доступ к новому значению. Другими словами, нефинальное статическое поле класса будет вести себя по-разному, если работает в одном JVM, чем в нескольких JVM. Контейнер EJB резервирует возможность распространения корпоративных компонентов на нескольких JVM (работающих на одном сервере или на любом кластере серверов). Нефинальные статические поля классов запрещены, поскольку экземпляры корпоративных компонентов будут вести себя по-разному в зависимости от того, распространяются они или нет.

Допускается использование статических полей классов, если эти поля отмечены как final. Поскольку окончательные поля не могут быть обновлены, экземпляры корпоративного компонента могут быть распределены контейнером без учета того, что значения этих полей становятся несинхронизированными.

Но при использовании статических полей только для чтения это не подходит для EJB. Безъядерные EJB могут быть объединены, контейнер может принять решение об их уничтожении (это конкретная реализация), и вы хотите разрешить контейнеру выбирать, какой экземпляр вы собираетесь использовать, особенно в распределенных средах. Другими словами, никогда не предполагайте, что вы привязаны к определенному экземпляру.

Итак, в конце, да, это вздор.

+0

Crystal прозрачный, спасибо! –

0

Из спецификации Java EE 5 вставка статических EJB разрешена только в основных классах клиента приложения.

Для всех классов, кроме основных классов клиентских приложений, поля или методы не должны быть статическими. Поскольку клиенты приложений используют тот же жизненный цикл, что и приложения J2SE, экземпляр основного класса клиента приложения не создается контейнером клиента приложения. Вместо этого вызывается статический основной метод. Чтобы поддерживать инъекцию основного класса клиента приложения, поля или методы, аннотированные для инъекций, должны быть статическими.

1

Я не понимаю, почему я не могу придать статический EJB в другой EJB?

Поскольку the spec не позволяет:

5.2.3Annotations и Инъекции

Как описано в следующих разделах, поля или методом некоторых классов компонентов, управляемых контейнером может быть аннотирован, чтобы запросить, чтобы запись из среды приложения была введена int o класс . [...] Для всех классов, кроме основных классов клиента приложения, поля или методы не должны быть статическим.

Обратите внимание, что исключение (основные классы клиента приложения) существует только потому, что эти классы никогда не создаются. В принципе, статические поля, как правило, проблематичны и, вдвойне вдвое, на сервере приложений, поскольку они могут обойти разделение потоков обработки запросов и транзакций, которые в первую очередь используют сервер приложений.

Смежные вопросы