Сервлет получает пустой объект от сессионного компонента EJB3

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

Итак, у меня есть приложение 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 ответ

Решение

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

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

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

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

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