Сервлет получает пустой объект от сессионного компонента EJB3 - PullRequest
0 голосов
/ 20 апреля 2010

Я уверен, что это ошибка новичка ...

Итак, у меня есть приложение Java EE 6 с сущностями, фасадами (реализующими уровень постоянства) и сессионными компонентами без сохранения состояния (EJB3) с удаленными интерфейсами (обеспечивающими доступ к сущностям через фасады).

Это работает нормально. С помощью SLSB я могу получать и манипулировать объектами.

Теперь я пытаюсь сделать это из веб-приложения (развернутого на том же Glassfish, определения сущностей + интерфейса из приложения Java EE, импортированные как отдельный jar). У меня есть сервлет, который получает инъекцию экземпляра SLSB. Я получаю его для извлечения сущности, и происходит следующее (я вижу это в журналах):

  • создается экземпляр удаленного SLSB, его метод называется
  • SLSB создает экземпляр фасада, вызывает метод get
  • фасад извлекает экземпляр сущности из БД, возвращает его
  • SLSB возвращает экземпляр сущности вызывающей стороне
    • (пока все хорошо)
  • вызывающий сервлет получает .. пустой экземпляр сущности !!

Что не так? Это должно работать, верно?

MyServlet:

public class MyServlet extends HttpServlet {

  @EJB
  private CampaignControllerRemote campaignController; // remote SLSB

  protected void processRequest(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    response.setContentType("text/plain");
    PrintWriter out = response.getWriter();
    try {
      Campaign c = campaignController.getCampaign(5L); // id of an existing campaign
      out.println("Got "+ c.getSomeString()); // is null !!
    } finally { 
        out.close();
    }
  }
  ...
}

Пожалуйста, дайте мне знать, если вы хотите увидеть другой код, и я обновлю сообщение.

1 Ответ

0 голосов
/ 21 апреля 2010

... о боже, это как-то стыдно ...

Оказывается, я игнорировал небольшое предупреждение об использовании Vector как типа поля, которое содержит @xxToMany отношение с FetchType.LAZY:

Элемент [поле someField] внутри класс сущности [класс Campaign] использует тип коллекции [класс java.util.Vector], когда JPA спецификация поддерживает только java.util.Collection, java.util.Set, java.util.List или java.util.Map. Этот тип поддерживается с нетерпением загрузка; используя ленивую загрузку с этим тип коллекции требует дополнительных конфигурация и IndirectContainer реализация, которая расширяет [класс java.util.Vector] или настройка отображение использовать базовую косвенность и тип должен быть ValueholderInterface.

Два возможных решения могут исправить мое поведение:

  • используйте FetchType.EAGER (тогда я мог бы остаться с Vector)
  • использовать List (как сказано в спецификации ...)
...