поиск ejb, переставший работать с NamingException

Прямо из Джакузи :

при использовании SQL MS можно использовать "ВЫБОР @@ ИДЕНТИФИКАЦИОННЫЕ ДАННЫЕ как Значение" после того, как вставка для получения последнего идентификатора генерировала

и:

@@IDENTITY и SCOPE_IDENTITY возвращают последнее значение идентификационных данных, сгенерированное в любой таблице на текущей сессии. Однако SCOPE_IDENTITY возвраты значение только в текущей области; @@IDENTITY не ограничен определенным объемом.

Редактирование: , Как указано в комментариях, необходимо всегда использовать SCOPE_IDENTITY, не @@IDENTITY.

11
задан Drake 24 September 2009 в 20:45
поделиться

3 ответа

Последние два ответа верны в том смысле, что их нужно изменить / исправить. Но NoSuchMethodError, который вы видите, не связан с вашим кодом или с вещами, пытающимися найти ваш код (я думаю, в этом случае возникло бы какое-то NoClassDefFoundException). Это больше похоже на несовместимые версии поставщика JNDI, предоставляемые контейнером, и на то, что хочет реализация JNDI в библиотеке Java. Это довольно расплывчатый ответ, но можно предположить, что его можно решить, возможно, обновив сервер приложений и убедившись, что вы не развертываете возможно устаревшие копии классов инфраструктуры, связанных с JNDI, с вашим приложением, это может помешать.

1
ответ дан 3 December 2019 в 01:33
поделиться

First, fix your web.xml and add the Remote Interface in it:

<ejb-ref>
  <description>Sample EJB</description>
  <ejb-ref-name>SampleBean</ejb-ref-name>
  <ejb-ref-type>Session</ejb-ref-type>
  <home>com.SampleHome</home>
  <remote>com.Sample</remote> <!-- the remote interface goes here -->
</ejb-ref>

Then, regarding the java.lang.NoSuchMethodError, Sean is right, you have a mismatch between the version of the app server "client library" you are using inside NetBeans and the app server version (server-side). I can't tell you exactly which JARs you need to align though, refer to the Sun Application Server documentation.

PS: This is not a direct answer to the problem but I don't think you're currently passing any useful properties when creating your initial context with the results of the call to System.getProperties(), there is nothing helpful in these properties to define the environment of a context (e.g. the initial context factory). Refer to the InitialContext javadocs for more details.

1
ответ дан 3 December 2019 в 01:33
поделиться

Я думаю, вы хотите получить доступ к приложению EJB (известному как модуль EJB) из веб-приложения на сервере приложений Sun, верно?

Хорошо, пошли.

Когда вы развертываете EJB на сервере приложений, сервер приложений дает ему адрес - известный как глобальный адрес JNDI - как способ доступа к нему (что-то вроде вашего адреса). Он меняется с одного сервера приложений на другой.

На сервере приложений JBoss вы можете увидеть глобальный адрес JNDI (после его запуска) по следующему адресу

http://127.0.0.1:8080/jmx-console/HtmlAdaptor

. На сервере приложений Sun, если вы хотите увидеть глобальный адрес JNDI (после его запуска), выполните следующие действия.

Войдите в административную консоль по следующему адресу

http://127.0.0.1:4848/asadmin

и щелкните Просмотр JNDI

Если ваш EJB НЕ зарегистрирован прямо здесь, что-то не так.

EJB бывает двух видов: EJB 2. 1 и EJB 3.0. Так в чем разница?

Ну, ну, ну ...

Начнем с EJB 2.1

  1. Создание домашнего интерфейса

Он определяет методы СОЗДАНИЯ, уничтожения и поиска локальных или удаленных объектов EJB . Он действует как интерфейсы жизненного цикла для объектов EJB. Все домашние интерфейсы должны расширять стандартный интерфейс javax.ejb.EJBHome - если вы используете удаленный объект ejb - или javax.ejb.EJBLocalHome - если вы используете локальный объект EJB.

// a remote EJB object - extends javax.ejb.EJBHome
// a local EJB object - extends javax.ejb.EJBLocalHome
public interface MyBeanRemoteHome extends javax.ejb.EJBHome {

    MyBeanRemote create() throws javax.ejb.CreateException, java.rmi.RemoteException;

}

Сервер приложений будет создавать домашние объекты как способ получить объект EJB, ничего больше.

Позаботьтесь о следующем

Удаленный домашний интерфейс сессионного компонента ДОЛЖЕН ОПРЕДЕЛЕНИЕ ОДНОГО ИЛИ БОЛЕЕ методов create . уничтожение и поиск локальных или удаленных объектов EJB. Он действует как интерфейсы жизненного цикла для объектов EJB. Все домашние интерфейсы должны расширять стандартный интерфейс javax.ejb.EJBHome - если вы используете удаленный объект ejb - или javax.ejb.EJBLocalHome - если вы используете локальный объект EJB.

// a remote EJB object - extends javax.ejb.EJBHome
// a local EJB object - extends javax.ejb.EJBLocalHome
public interface MyBeanRemoteHome extends javax.ejb.EJBHome {

    MyBeanRemote create() throws javax.ejb.CreateException, java.rmi.RemoteException;

}

Сервер приложений будет создавать домашние объекты как

Позаботьтесь о следующем.

Удаленный домашний интерфейс сессионного компонента ДОЛЖЕН ОПРЕДЕЛЕНИЕ ОДНОГО ИЛИ БОЛЕЕ методов create . уничтожение и поиск локальных или удаленных объектов EJB. Он действует как интерфейсы жизненного цикла для объектов EJB. Все домашние интерфейсы должны расширять стандартный интерфейс javax.ejb.EJBHome - если вы используете удаленный объект ejb - или javax.ejb.EJBLocalHome - если вы используете локальный объект EJB.

// a remote EJB object - extends javax.ejb.EJBHome
// a local EJB object - extends javax.ejb.EJBLocalHome
public interface MyBeanRemoteHome extends javax.ejb.EJBHome {

    MyBeanRemote create() throws javax.ejb.CreateException, java.rmi.RemoteException;

}

Сервер приложений будет создавать домашние объекты как способ получить объект EJB, ничего больше.

Позаботьтесь о следующем

Удаленный домашний интерфейс сессионного компонента ДОЛЖЕН ОПРЕДЕЛЕНИЕ ОДНОГО ИЛИ БОЛЕЕ методов create . Сессионный компонент без сохранения состояния ДОЛЖЕН ОПРЕДЕЛИТЬ ровно один метод без аргументов.

...

throws clause ДОЛЖЕН ВКЛЮЧАТЬ javax.ejb.CreateException

...

Если ваш домашний интерфейс расширяет javax. ejb.EJBHome, предложения throws ДОЛЖНЫ ВКЛЮЧАТЬ исключение java.rmi.RemoteException. Если он расширяет javax.ejb.EJBLocalHome, НЕ ДОЛЖЕН ВКЛЮЧАТЬ исключение java.rmi.RemoteException.

...

Каждый метод create сеансового bean-компонента с отслеживанием состояния ДОЛЖЕН НАЗВАТЬСЯ create , и он должен соответствовать одному из методов Init или методов ejbCreate , определенных в сеансе фасоль. Соответствующий метод ejbCreate ДОЛЖЕН ИМЕТЬ ОДИНАКОВЫЕ НОМЕР И ТИПЫ АРГУМЕНТОВ. Метод create для сеансового компонента без сохранения состояния ДОЛЖЕН НАЗВАТЬСЯ create , но не должен иметь соответствующий метод «ejbCreate».


Теперь создайте бизнес-интерфейс, чтобы определить бизнес-логику в нашем объекте EJB

// a remote EJB object - extends javax.ejb.EJBObject
// a local EJB object - extends javax.ejb.EJBLocalObject
public interface MyBeanRemote extends javax.ejb.EJBObject {

    void doSomething() throws java.rmi.RemoteException;

}

Теперь позаботьтесь о следующем.

Если вы используете удаленный объект EJB, методы удаленного интерфейса НЕ ДОЛЖНЫ открывать типы локальных интерфейсов или типы локальных домашних интерфейсов.

...

Если ваш домашний интерфейс расширяет javax.ejb .EJBObject, предложения throws ДОЛЖНЫ ВКЛЮЧАТЬ исключение java.rmi.RemoteException. Если он расширяет javax.ejb.EJBLocalObject, НЕ ДОЛЖЕН ВКЛЮЧАТЬ исключение java.rmi.RemoteException.


Теперь наш EJB

public class MyBean implements javax.ejb.SessionBean {

    // why create method ? Take a special look at EJB Home details (above)
    public void create() {
        System.out.println("create");
    }

    public void doSomething() throws java.rmi.RemoteException {
        // some code
    };

}

Теперь позаботьтесь о следующем

Он ДОЛЖЕН РЕАЛИЗОВАТЬ javax.ejb.SessionBean. Он определяет четыре метода, не показанных выше: setSessionContext, ejbRemove, ejbPassivate и ejbActivate.

Обратите внимание, что наш bean-компонент НЕ РЕАЛИЗУЕТ наш бизнес-интерфейс из-за спецификации EJB:

Для каждого метода, определенного в интерфейсе, должен быть соответствующий метод в сеансе. класс фасоли. Метод сопоставления должен иметь:

  • То же имя
  • Такое же количество и типы аргументов и тот же тип возвращаемого значения.
  • Все исключения, определенные в предложении throws метода сопоставления сеанса там должен быть соответствующий метод в классе сессионного компонента. Метод сопоставления должен иметь:

    • То же имя
    • Такое же количество и типы аргументов и тот же тип возвращаемого значения.
    • Все исключения, определенные в предложении throws метода сопоставления сеанса там должен быть соответствующий метод в классе сессионного компонента. Метод сопоставления должен иметь:

      • То же имя
      • Такое же количество и типы аргументов и тот же тип возвращаемого значения.
      • Все исключения, определенные в предложении throws метода сопоставления сеанса Я предлагаю следующее

        1. Создать простую библиотеку Java PROJECT (простую банку без основного метода)
        2. Добавить / server / default / lib (содержит файлы jar, чтобы вы могли извлекать файлы EJB) в свое приложение Java независимо от того, вы используете JBoss (я не знаю, какой каталог на сервере приложений Sun)
        3. Реализуйте код выше

        Теперь создайте еще один военный ПРОЕКТ

        1. Добавьте наш проект, созданный чуть выше, и добавьте / client (содержит файлы jar чтобы получить доступ к нашим EJB). Опять же, я не знаю, какой каталог на сервере приложений Sun. Ознакомьтесь с его документацией.
37
ответ дан 3 December 2019 в 01:33
поделиться
Другие вопросы по тегам:

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