GWT EJB, передающий объекты

У меня есть вопрос из-за архитектуры моего проекта.

С одной стороны есть пакет GWT со стороной клиента, а также сервлет для связи с проектом EJB. На другой стороне есть проект EJB с сеансовыми компонентами и объектами, которые должны храниться в базе данных и отправляться между клиентом GWT и базой данных. Как я могу это понять?

Как я могу отправить объект из своего сеансового компонента в сервлет GWT, потому что сервлет GWT не знает о классах сущностей.


person ph09    schedule 02.12.2011    source источник


Ответы (2)


Ваш BeanServiceImpl может знать о ваших объектах EJB. Этого не может сделать только клиентская сторона проекта GWT. Таким образом, где-то в вашем пакете server у вас будет транслятор/маршаллер/конвертер для переключения с вашей сущности EJB Company на CompanyDTO для клиентской стороны. На самом деле, он может иметь все те же поля, только не аннотацию @Entity, очевидно. Вот так:

private CompanyDTO convert(Company ejb) {
  CompanyDTO dto = new CompanyDTO(ejb.getName());
  dto.setAddress(ejb.getAddress());
  return dto;
}

Затем ваш код GWT на стороне клиента может обрабатывать эти DTO, переводя их обратно в объекты на стороне сервера, когда вам нужно выполнить транзакцию.

person Jason482    schedule 02.12.2011
comment
Спасибо, это работает, но это приведет к дублированию кода и будет более сложным. Вы когда-нибудь тестировали RequestFactory? - person ph09; 02.12.2011
comment
@ ph09 Определенно, это дублирует код. Альтернативой может быть RequestFactory, но я сам не реализовал с ним никакого решения. Я изучил это, но в нашей архитектуре это не совсем просто реализовать. - person Jason482; 03.12.2011
comment
Я нашел решение: @OneToMany(cascade={CascadeType.PERSIST}, fetch = FetchType.EAGER) private Collection‹Person› personen = new Vector‹Person›(); с помощью аннотации FetchType.Eager вы можете отправлять коллекцию объектов и их ссылки на клиентскую сторону. - person ph09; 05.12.2011
comment
@ ph09 Я рад, что у тебя все получилось! Если вы считаете, что мой ответ был правильным, вы можете принять его. Если нет, сообществу поможет, если вы обобщите свое полное решение в новом ответе и примете его как правильное. - person Jason482; 05.12.2011

Я попробовал это, и мне удалось отправить объект от клиента к EJB и сохранить его в базе данных MYSQL: http://www.vogella.de/articles/GWT/ar01s08.html

Но когда я пытаюсь отправить его обратно клиенту, я всегда получаю исключение: com.google.gwt.user.client.rpc.SerializationException: Type 'org.eclipse.persistence.indirection.IndirectList' не был включен в набор типов, которые могут быть сериализованы этой SerializationPolicy или ее объектом класса, не удалось загрузить. В целях безопасности этот тип не будет сериализован.: instance = {IndirectList: не создан}

Поэтому я думаю, что вам нужно использовать DTO.

person ph09    schedule 02.12.2011