Je souhaite utiliser la gestion des exceptions avec les clients Restlet Framework et GWT. Restlet Framework prend en charge le concept d'exceptions annotées tel que décrit dans ce message;Recevoir des exceptions personnalisées à partir de Restlet Framework dans le client GWT
http://restlet.com/company/blog/2015/12/21/exception-handling-with-restlet-framework/
Dans mon projet, j'ai créé un LocationNameException
@Status(value = 409)
public class LocationNameException extends Exception
{
...
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
public LocationNameException(String pMessage, Throwable pCause)
{
super(pMessage, pCause);
}
}
Et utiliser dans mon 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;
}
Avec l'interface
public interface LocationListServerResourceInt
{
...
@Post
LocationDto postLocation(LocationDto pLocationDto) throws LocationNameException;
...
}
Cela fonctionne, dans le cas d'une exception l'appel retourne le code 409;
Et au onFailure côté client GWT() est appelée;
private class PostLocationCallback implements AsyncCallback<LocationDto>
{
...
@Override
public void onFailure(Throwable pCaught)
{
mCallback.onFailure(pCaught, mLocationDto);
}
}
Mais paramètre pCaught contient seulement ResourceException avec le code d'état 409. Mon LocationNameException ne figure pas dans la pile de cause sous-jacente. J'ai besoin de cette LocationNameException pour la gestion appropriée des messages d'erreur.
La raison en est la ServerResourceProxy LocationListServerResourceProxyImpl générée par le 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
{
...
}
Je pense que je dois réécrire la méthode Post dans le ClientProxyGenerator;
Le LocationNameException est présent dans les données de réponse de sorte the Basic approach using the getResponseEntity() method of the ClientResource class should be possible.
Est-ce la voie à suivre? Ou puis-je attraper l'exception LocationNameException ailleurs comme suggéré par Catching annotated exceptions?
Il est vraiment difficile d'essayer une approche différente à cause du code généré. Existe-t-il un moyen facile de contourner le générateur de code avec des classes personnalisées?
Il reste maladroitement silencieux autour de ce problème ... Restlet/GWT est-il toujours vivant? Quelqu'un at-il déjà utilisé des exceptions de serveur dans les clients GWT avec Restlet? –
Salut Roland, le support pour l'exception annotée dans Restlet/GWT n'a pas été développé, mais il devrait être techniquement réalisable. Pensez-vous que vous pourriez contribuer? Content de vous soutenir pendant ce processus. –
Bonjour Jérôme, oui je pense que je peux y contribuer. Le défi n'est pas l'exception annotée (je peux juste utiliser l'approche de base décrite) mais le ClientProxyGenerator (donc le truc du compilateur GWT ...). J'ai essayé d'utiliser le code source généré dans mon projet mais il y a des problèmes avec le ServerResourceProxy_TypeSerializer ... Avez-vous un exemple de travail/compilation ServerResourceProxyImpl/ServerResourceProxy_TypeSerializer avec lequel je peux jouer? –