Исходный код 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'/>

Любые идеи о том, как сообщить eclipse, где найти исходный код?

Спасибо

Вот код:

//Создаем композитор из 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;
}

///Выполнить запрос от 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?

person jmbz    schedule 02.06.2012    source источник


Ответы (2)


Вы вообще не можете использовать такие типы, как EntityExistsException или EntityNotFoundException, в коде GWT на стороне клиента.

Это простые классы Java, и GWT не знает, как перевести их в JavaScript.

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

Я думаю, что вы действительно хотите сделать что-то вроде этого:

public void onFailure(ServerFailure failure) throws Throwable {
    if(failure.getExceptionType().equals("javax.persistence.EntityExistsException")){
          ...
    }else if(failure.getExceptionType().equals("javax.persistence.EntityNotFoundException")){
       ...
    }
}

Поскольку тип исключения на стороне сервера можно прочитать как строку, см. Javadoc для Receiver и ServerFailure.

person Piotr Sobczyk    schedule 02.06.2012

Спасибо Петр за помощь.

Вот код того, что я наконец сделал:

Код в клиенте

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 failure' содержит информацию только в failure.message; все остальные переменные равны нулю.

person jmbz    schedule 08.06.2012