Использование EJB с обычными классами Java. Попытка создать экземпляр EJB без гражданства - PullRequest
1 голос
/ 10 декабря 2011

У меня большой веб-проект в Java EE 6, пока все работает отлично.

Теперь я добавляю новый класс, который получает информацию из твиттера и возвращает строку.До сих пор строки были извлечены из файла JSON из твиттера и готовы к сохранению в моей базе данных.Моя проблема в том, что я не уверен, как передавать информацию из EJB, который обычно обрабатывает все вызовы моей базы данных.Я использую JPA и у меня есть класс DAO, который управляет всем доступом к базе данных.У меня уже есть метод для updateDatabase(String).Я хотел бы иметь возможность вызывать updateDatabase(String) из класса, в котором есть строки, которые нужно добавить, но я не знаю, хорошо ли это создавать экземпляр такого компонента без состояния.Обычно вы вводите бины, а затем вызываете только их имя класса для доступа к их методам.Я мог бы также попытаться сослаться на класс генерации строк в твиттере изнутри EJB, но тогда мне пришлось бы создать его экземпляр и связываться с вызовами метода main () для выполнения.Я не совсем уверен, как это сделать.Прямо сейчас мой потребляющий Твиттер класс - это просто POJO с методом main.По какой-то причине некоторые из библиотечных методов не работали вне main в API-интерфейсе IOUtils () для лица напрямую говорится: «Экземпляры НЕ должны создаваться в стандартном программировании».

Итак, на более высоком уровне, я просто спрашиваю, как POJO обычно "смешиваются" в проекте Java EE, где большинство ваших классов - EJB и сервлеты.

Редактировать: вышеизложенное кажется мне запутанным после перечитывания, поэтому я постараюсь упростить его.в основном у меня есть класс с основным методом.Я хотел бы вызвать мой класс EJB, который обрабатывает доступ к базе данных, вызвать его метод updateDatabase(String) и просто передать строку.Как мне это сделать?

Редактировать: Таким образом, похоже, что поиск JNDI и ссылка на подпоследовательность являются предпочтительным способом сделать это, а не создавать экземпляр EJB напрямую?

Редактировать: все эти классы находятся в одном веб-проекте.В той же упаковке.Я мог бы ввести один или преобразовать POJO в EJB.Однако POJO имеет метод main, и некоторые из библиотечных файлов не любят создаваться, поэтому запуск его в main кажется лучшим вариантом.

Мой основной код:

public class Driver {

    @EJB
    static RSSbean rssbean;   

    public static void main(String[] args) throws Exception {

        System.setProperty("http.proxyHost", "proxya..com");
        System.setProperty("http.proxyPort", "8080");
        /////////////auth code///////////////auth code/////////////////
        String username = System.getProperty("proxy.authentication.username");
        String password = System.getProperty("proxy.authentication.password");
        if (username == null) {
            Authenticator.setDefault(new ProxyAuthenticator("", ""));
        }
        ///////////////end auth code/////////////////////////////////end

        URL twitterSource = new URL("http://search.twitter.com/search.json?q=google");
        ByteArrayOutputStream urlOutputStream = new ByteArrayOutputStream();

        IOUtils.copy(twitterSource.openStream(), urlOutputStream);
        String urlContents = urlOutputStream.toString();
        JSONObject thisobject = new JSONObject(urlContents);
        JSONArray names = thisobject.names();
        JSONArray asArray = thisobject.toJSONArray(names);
        JSONArray resultsArray = thisobject.getJSONArray("results");
        JSONObject(urlContents.substring(urlContents.indexOf('s')));                
        JSONObject jsonObject = resultsArray.getJSONObject(0);

        String twitterText = jsonObject.getString("text");          
        rssbean.updateDatabase("twitterText"); 
    }
}  

Я также получаю java.lang.NullPointerException где-то около rssbean.updateDatabase("twitterText");

Ответы [ 3 ]

6 голосов
/ 10 декабря 2011

Вы должны использовать метод InitialContext#lookup для получения ссылки на EJB с сервера приложений.
Например:

@Stateless(name="myEJB")
public class MyEJB {

  public void ejbMethod() {
    // business logic
  }

}

public class TestEJB {

  public static void main() {
    MyEJB ejbRef = (MyEJB) new InitialContext().lookup("java:comp/env/myEJB");
    ejbRef.ejbMethod();
  }
}

Однако обратите внимание, что имя ejb, используемое для поиска, может зависеть от поставщика.Кроме того, в EJB 3.1 представлена ​​идея переносимых имен JNDI , которые должны работать на каждом сервере приложений.

1 голос
/ 10 декабря 2011

Если у вас есть отдельная программа, которая хочет получить доступ к EJB, у вас есть несколько вариантов.

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

Другой метод заключается в использовании артефакта Java EE, известного как «клиент приложения». Здесь для вашего класса есть оболочка поставщика контейнера, но она обеспечивает среду выполнения, очень похожую на запуск класса в контейнере, в частности, вы получаете такие вещи, как EJB инъекция.

Ваше приложение по-прежнему работает в отдельной JVM, поэтому вам все равно нужно ссылаться на удаленные EJB-компоненты, но клиентский контейнер приложения обрабатывает кучу базовой схемы при подключении вашего приложения к серверу. Это также, хотя и артефакт Java EE, также зависит от контейнера при настройке и запуске клиентского приложения.

Наконец, в принципе мало различий в том, как POJO взаимодействует с контейнером EJB, в отличие от POJO, развернутого в контейнере. Интерфейс все еще остается вопросом ввода EJB (легче сделать в Java EE 6, чем раньше) или поиска ссылки через JNDI. Единственное существенное отличие состоит в том, что POJO, развернутый в контейнере, может использовать локальный интерфейс вместо удаленного.

1 голос
/ 10 декабря 2011

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

Из википедии: EJB - это серверная модель, которая инкапсулирует бизнес-логику приложения.

Ваш класс POJO использует веб-сервис, поэтому он выполняет бизнес-логику за вас.

РЕДАКТИРОВАТЬ> После прочтения вашего комментария вы пытаетесь получить доступ к EJB извне контейнера Java EE?Потому что если нет, то вы можете вставить свой EJB в другой EJB (оба они ДОЛЖНЫ быть лицами без гражданства)

...