Вводя статический 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?

12
задан Cyril Gandon 7 July 2010 в 13:48
поделиться

3 ответа

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

Почему это так? Прежде всего, статические поля чтения/записи полностью запрещены в EJB (это часть ограничения EJB). Из Почему я не могу использовать нефинальные статические поля в своих корпоративных бобах?

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

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

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

Так что в конце концов, да, это нонсенс.

27
ответ дан 2 December 2019 в 05:26
поделиться

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

Потому что спецификация не позволяет этого:

5.2.3Анотации и инъекции

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

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

1
ответ дан 2 December 2019 в 05:26
поделиться

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

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

0
ответ дан 2 December 2019 в 05:26
поделиться
Другие вопросы по тегам:

Похожие вопросы: