Использование сущностей с GWT + EJB + JPA - PullRequest
0 голосов
/ 21 апреля 2011

Чтобы быть точным, я использую GWT (2.0) + EJB (3.x) + JPA, развернутый в GlassFish и использующий Eclipse Helios J2EE.

В моем проекте EJB есть две сущности: сущности клиента и провайдера. Используя RPC, я звоню из GWT в проект EJB, который извлекает некоторые объекты и отправляет их обратно в проект GWT. Вызов примерно такой:

GWT вызывает findClient из EJB, который использует EntityManager для поиска объекта Client и возвращает его в GWT. Однако, когда я пытаюсь завершить мой проект GWT, я получаю следующее

Compiling module com.MYPROJECT
   Validating newly compiled units
      [ERROR] Errors in 'file:/.....****....../GreetingService.java'
         [ERROR] Line 20: No source code is available for type com.MYPROJECT.entities.Client; did you forget to inherit a required module?
         [ERROR] Line 26: No source code is available for type com.MYPROJECT.entities.Provider; did you forget to inherit a required module?
      [ERROR] Errors in 'file:/C:/workspaces/...***.../GreetingServiceAsync.java'
         [ERROR] Line 14: No source code is available for type com.MYPROJECT.entities.Client; did you forget to inherit a required module?
         [ERROR] Line 16: No source code is available for type com.MYPROJECT.entities.Provider; did you forget to inherit a required module?

Ответы [ 2 ]

2 голосов
/ 21 апреля 2011

В сообщении об ошибке сказано все, даже если вы этого не понимаете (у меня была такая же проблема).GWT компилирует код Java в код JavaScript и для этого требуется исходный код.Вы, вероятно, включаете упомянутые объекты из другой библиотеки, и поэтому исходный код для них недоступен, и поэтому GWT не может выполнять свою работу.

Что вам (к сожалению) нужно сделать, это создать отдельнуюОбъект (в рамках вашего проекта) и перемешать (т.е. переместить) данные из вашей сущности в этот новый объект.

Вам нужно будет убедиться, что вы перемещаете данные правильным образом, то есть что-то вроде следующего:

static copyDataToGwtObject(MyObj obj) {
    MyGwtObject gwtObj = new MyGwtObject();
    gwtObj.setValueA(obj.getValueA());
    gwtObj.setValueB(obj.getValueB());
}

Что (к сожалению) не сработает, так это перемещение данных в конструкторе MyGwtObject :-(, т.е. не делает что-то вроде этого:

class MyGwtObject {
    private String valueA;
    private String valueB;
    public MyGwtObject(MyObj obj) {
        this.valueA = obj.getValueA();
        this.valueB = obj.getValueB();
    }
}

Это не будет работать, поскольку GWT (снова) понадобится исходный код для конструктора.

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

Ваш GreetingService а RemoteService?Я использую для "перевода" объектов, которые сервер возвращает в эквивалентные объекты, которые я создал в клиентском проекте:

В GreetingSerciceImpl (что расширяет RemoteServiceServlet), я бы написал:

public TestClient someMethod() {
  Client c = ejbClass.getClient() // returns object of Client class defined in the EJB project
  return translate(c);
}

private TestClient translate(Client c) {
  TestClient tc = new TestClient();
  tc.setName(c.getName());
  return tc;
}

Где TestClient определено где-то в клиентском коде проекта GWT.

HTH

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...