GWT+JPA Persistence.Exception Исходный код не найден
Я пытаюсь создать простое соединение с БД с использованием JPA. Это работает нормально, но когда я пытаюсь сгенерировать исключение для клиента, я получаю сообщение об ошибке:
[ERROR] [browsereditor] - Line 210: No source code is available for type javax.persistence.EntityExistsException; did you forget to inherit a required module?
[ERROR] [browsereditor] - Line 212: No source code is available for type javax.persistence.EntityNotFoundException; did you forget to inherit a required module?
Я не получаю ошибки в режиме разработки, и он прекрасно компилируется, но когда загружается модуль приложения, я получаю сообщение об ошибке.
У меня есть необходимый импорт в классах server/Composer и client/Presenter
import javax.persistence.EntityExistsException;
import javax.persistence.EntityNotFoundException;
Я также добавил следующие jar-файлы в путь к классам и пути сборки:
javax.persistence.jar
jpa-annotations-source.jar (http://code.google.com/p/google-web-toolkit/issues/detail?id=1830#c14)
Я также попытался добавить в gwt.xml
<source path='client'/>
<source path='shared'/>
<source path='server'/>
Любые идеи о том, как сказать затмение, где найти исходный код??
Спасибо
Вот код:
// Создать композитора из Composer.class на сервере
public static Composer createComposer(String name)
throws EntityExistsException {
Composer comp = new Composer();
comp.setName(name);
comp.setId(1);
EntityManager entityManager = entityManager();
entityManager.getTransaction().begin();
entityManager.persist(comp);
entityManager.getTransaction().commit();
entityManager.close();
return comp;
}
/// fire Запрос от createComposer (выше) в Presenter.class
req.fire(new Receiver<ComposerProxy>() {
public void onSuccess(ComposerProxy arg0) {
ComposerProxy comp;
comp = arg0;
}
public void onFailure(Throwable caught)
throws Throwable {
// Convenient way to find out which exception
// was thrown.
try {
throw caught;
} catch (EntityExistsException e) {
} catch (EntityNotFoundException e) {
}
}});
}});
[ERROR] [browsereditor] - Line 210: No source code is available for type javax.persistence.EntityExistsException; did you forget to inherit a required module?
[ERROR] [browsereditor] - Line 212: No source code is available for type javax.persistence.EntityNotFoundException; did you forget to inherit a required module?
2 ответа
Вы не можете использовать такие типы, как EntityExistsException
или же EntityNotFoundException
в коде GWT на стороне клиента вообще.
Это простые Java-классы, и GWT не знает, как перевести их в JavaScript.
Вы можете использовать только очень ограниченную часть внешних библиотек в своем клиентском коде. Эти библиотеки (например, Visualization) разработаны и подготовлены специально для клиентской стороны и требуют наследования их модуля GWT в модуле вашего приложения.
Я думаю, что вы действительно хотите сделать что-то вроде этого:
public void onFailure(ServerFailure failure) throws Throwable {
if(failure.getExceptionType().equals("javax.persistence.EntityExistsException")){
...
}else if(failure.getExceptionType().equals("javax.persistence.EntityNotFoundException")){
...
}
}
Поскольку вы можете прочитать тип серверного исключения как String, см. Javadoc для Receiver и ServerFailure.
Спасибо Петру за вашу помощь.
Вот код для того, что я наконец сделал:
Код в клиенте
req.fire(new Receiver<ComposerProxy>() {
public void onSuccess(ComposerProxy arg0) {
ComposerProxy comp;
comp = arg0;
}
public void onFailure(ServerFailure failure) {
serverError.getServerError(failure,
"onAddButtonClicked");
}
});
Я создал класс для обработки ошибок
public class ServerError {
public ServerError() {
}
public void getServerError(ServerFailure failure, String message) {
// Duplicate Key Error
if (failure.getMessage().contains(
"IntegrityConstraintViolationException")) {
Window.alert("Duplicate Key " + message);
return;
}
// Connection Error
if (failure.getMessage().contains("NonTransientConnectionException")) {
Window.alert("Connection error ");
return;
}
// TimeOut Error
if (failure.getMessage().contains("TimeoutException")) {
Window.alert("Timeout Error" + message);
return;
}
// Other Error
else {
Window.alert("Duplicate Key " + message);
return;
}
}
}
Сервис на сервере
public static Composer createComposer(String name) throws Throwable {
EntityManager entityManager = entityManager();
Composer comp = new Composer();
try {
comp.setName(name);
comp.setId(1);
entityManager.getTransaction().begin();
entityManager.persist(comp);
entityManager.getTransaction().commit();
} catch (Exception e) {
log.error("Error in Composer::createComposer( " + name + ") //"
+ e.toString());
throw e;
} finally {
entityManager.close();
}
return comp;
}
Одна проблема, которую я обнаружил, заключается в том, что переменная ServerFailure fails содержит информацию только в файле fail.message; все остальные переменные равны нулю.