Сервлет получает пустой объект от сессионного компонента 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
(как сказано в спецификации...)