Совместное использование кода в движке приложения GWT
У меня есть класс Employee
@PersistenceCapable(identityType = IdentityType.APPLICATION)
public class Employee {
@PrimaryKey
@Persistent(valueStrategy = IdGeneratorStrategy.IDENTITY)
private Key key;
@Persistent
private String firstName;
@Persistent
private String lastName;
@Persistent
private Date hireDate;
public Employee(String firstName, String lastName, Date hireDate) {
this.firstName = firstName;
this.lastName = lastName;
this.hireDate = hireDate;
}
// Accessors for the fields. JDO doesn't use these, but your application does.
public Key getKey() {
return key;
}
public String getFirstName() {
return firstName;
}
public void setFirstName(String firstName) {
this.firstName = firstName;
}
public String getLastName() {
return lastName;
}
public void setLastName(String lastName) {
this.lastName = lastName;
}
public Date getHireDate() {
return hireDate;
}
public void setHireDate(Date hireDate) {
this.hireDate = hireDate;
}
}
Я использовал JDO для движка приложения. Теперь я хочу поделиться этим кодом между сервером и клиентом. В каком пакете я должен хранить это. На самом деле я пробовал оба пути. Ни один не сработал. Пожалуйста, поделитесь, если вы уже сделали этот тип кодов.
4 ответа
Если то, что вы ищете, - это создание ваших сущностей как на клиенте, так и на сервере, то размещение классов в пакете "client" поможет.
Но если вы пытаетесь передать свои постоянные сущности через RPC, это, вероятно, не будет работать из коробки. DataNucleus "включает" байт-код, и RPC не может затем сериализоваться. Hibernate имеет аналогичную проблему, пожалуйста, посмотрите на эту статью, она очень хорошо объясняет проблему и предлагает альтернативы.
Я создаю DTO для решения этой проблемы. Это немного больше работы, но это действительно зависит от того, сколько у вас есть сущностей.
Возможно, нам нужно больше подробностей, так как вы можете столкнуться с рядом проблем, но вот несколько советов:
Пакет не имеет большого значения, пока его видят и GWT-компилятор, и javac. Я храню общий код в пакете с соответствующим названием... "общий".:)
Ключ недоступен в GWT, поэтому используйте закодированную строку Key.
JDO сложно, но выполнимо. Более новые версии GWT (после выпуска Java AppEngine) смогли обработать расширение JDO в DataNucleus. Я бы позаботился о том, чтобы вы работали вне транка или с недавнего снимка, на случай, если DataNucleus - ваша проблема.
Убедитесь, что вы отсоединили свои объекты перед отправкой их клиенту.
Вот почему я использую API низкого уровня. Я написал вспомогательный класс, который преобразует сущность в pojo и обратно. Таким образом, я получаю сущность, которая преобразуется в желаемый POJO, который затем отправляется клиенту. От клиента тот же POJO возвращается к серверу, который преобразуется в сущность с помощью моего вспомогательного класса, а затем простой вызов put делает свое дело. Вам не нужно ничего прикреплять / прикреплять... Я могу поделиться кодом, если хотите.
Я делал это раньше, но только в небольшом тестовом приложении. Предполагая, что вы используете GWT-RPC, он должен работать довольно гладко. Вам придется сделать две вещи:
- Поместите код в пространство имен "клиента", то есть в каталог, который компилируется GWT. Вы все еще можете использовать этот код на сервере.
- Нажмите "Компилировать" и начните исправлять ошибки. Основным, что вы найдете, является то, что тип "Ключ" недоступен на земле GWT. Вместо этого вы можете использовать строковый ключ. См. Раздел "ключ как закодированная строка" в соответствующей документации.
Если вы не используете GWT-RPC, вы сами по себе. JSON привлекателен для этой цели, но требует значительных усилий. Это должно быть лучше в GWT 2.0, но не исчезнет полностью.