Я хочу использовать обработку исключений с клиентами Restlet Framework и GWT. Restlet Framework поддерживает концепцию аннотированных исключений, как описано в этом посте;
http://restlet.com/company/blog/2015/12/21/exception-handling-with-restlet-framework/
В моем проекте я создал LocationNameException
@Status(value = 409)
public class LocationNameException extends Exception
{
...
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
public LocationNameException(String pMessage, Throwable pCause)
{
super(pMessage, pCause);
}
}
И используйте это в моем ServerResource;
@Override
@Transactional(rollbackOn = LocationNameException.class)
public LocationDto postLocation(LocationDto pLocationDto) throws LocationNameException
{
...
Location lLocation = new Location(pLocationDto);
try
{
LocationDao lLocationDao = getLocationDao();
lLocationDao.persist(lLocation);
}
catch (PersistenceException pPersistenceException)
{
throw new LocationNameException("Location requires unique Name", pPersistenceException);
}
...
return lLocationDto;
}
С интерфейсом
public interface LocationListServerResourceInt
{
...
@Post
LocationDto postLocation(LocationDto pLocationDto) throws LocationNameException;
...
}
Это работает, в случае исключения вызов возвращает код 409;
И на стороне клиента GWT вызывается onFailure();
private class PostLocationCallback implements AsyncCallback<LocationDto>
{
...
@Override
public void onFailure(Throwable pCaught)
{
mCallback.onFailure(pCaught, mLocationDto);
}
}
Но параметр pCaught содержит только ResourceException с кодом состояния 409. Мое LocationNameException не включено в основной стек причин. Мне нужно это LocationNameException для соответствующей обработки сообщений об ошибках.
Причиной является сгенерированный ServerResourceProxy LocationListServerResourceProxyImpl с помощью Restlet GWT ClientProxyGenerator;
public void postLocation(LocationDto param1, final LocationDto> callback)
{
...
public void handle(Request request, Response response)
{
if (getClientResource().getStatus().isError())
{
callback.onFailure(new ResourceException(getClientResource().getStatus()));
}
else
{
...
}
Я думаю, что мне нужно переписать метод Post в ClientProxyGenerator;
Исключение LocationNameException присутствует в данных ответа, поэтому Базовый подход с использованием метода getResponseEntity() класса ClientResource должен быть возможен.
Это путь? Или я могу перехватить исключение LocationNameException в другом месте, как это было предложено Перехват аннотированных исключений?
Очень сложно попробовать другой подход из-за сгенерированного кода. Есть ли простой способ обойти генератор кода с помощью пользовательских классов?