Java 在GWT客户机中从Restlet框架接收自定义异常
我想对Restlet框架和GWT客户机使用异常处理。 Restlet框架支持本文中描述的注释异常的概念 在我的项目中,我创建了一个LocationNameExceptionJava 在GWT客户机中从Restlet框架接收自定义异常,java,gwt,exception-handling,restlet,Java,Gwt,Exception Handling,Restlet,我想对Restlet框架和GWT客户机使用异常处理。 Restlet框架支持本文中描述的注释异常的概念 在我的项目中,我创建了一个LocationNameException @Status(value = 409) public class LocationNameException extends Exception { ... /////////////////////////////////////////////////////////////////////////
@Status(value = 409)
public class LocationNameException extends Exception
{
...
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
public LocationNameException(String pMessage, Throwable pCause)
{
super(pMessage, pCause);
}
}
并在我的服务器资源中使用它
@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);
}
}
我想我必须在ClientProxyGenerator中重写Post方法
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
{
...
}
Class<?>[] exceptionTypes = method.getExceptionTypes();
java.lang.reflect.Type[] genericExceptionTypes = method.getGenericExceptionTypes();
响应数据so中存在LocationNameException
这是路吗?或者我可以按照建议在其他地方捕获LocationNameException异常吗
因为生成的代码,所以很难尝试不同的方法。有没有一种简单的方法可以通过自定义类绕过代码生成器 如前所述,LocationNameException出现在响应数据中。 所以我们可以得到它,就像一个正常的实体
...
public void handle(Request request, Response response)
{
if (getClientResource().getStatus().isError())
{
LocationNameException lLocationNameException = null;
boolean serializationError = false;
try
{
if (response.isEntityAvailable())
{
if (MediaType.APPLICATION_JAVA_OBJECT_GWT.equals(response.getEntity().getMediaType()))
{
lLocationNameException = new ObjectRepresentation<LocationNameException>(
response.getEntity().getText(),
(SerializationStreamFactory) MyLocationListServerResourceProxyImpl.this, false)
.getObject();
}
else
{
throw new IOException("Can't parse the enclosed LocationNameException.");
}
}
}
catch (Throwable e)
{
serializationError = true;
callback.onFailure(new ResourceException(e));
}
if (!serializationError)
{
callback.onFailure(lLocationNameException);
}
}
else
{
...
如前所述,LocationNameException出现在响应数据中。 所以我们可以得到它,就像一个正常的实体
...
public void handle(Request request, Response response)
{
if (getClientResource().getStatus().isError())
{
LocationNameException lLocationNameException = null;
boolean serializationError = false;
try
{
if (response.isEntityAvailable())
{
if (MediaType.APPLICATION_JAVA_OBJECT_GWT.equals(response.getEntity().getMediaType()))
{
lLocationNameException = new ObjectRepresentation<LocationNameException>(
response.getEntity().getText(),
(SerializationStreamFactory) MyLocationListServerResourceProxyImpl.this, false)
.getObject();
}
else
{
throw new IOException("Can't parse the enclosed LocationNameException.");
}
}
}
catch (Throwable e)
{
serializationError = true;
callback.onFailure(new ResourceException(e));
}
if (!serializationError)
{
callback.onFailure(lLocationNameException);
}
}
else
{
...
在Jerome Louvel和Thierry Boileau的帮助下,我创建了一个新的ClientProxyGenerator(),它支持针对GWT客户端的自定义异常 只需从ServerResourceProxy(ClientProxy)中的接口指定异常 瞧 可以立即在项目中使用此自定义ClientProxyGenerator() 并将其放在服务器上的包中(例如包com.ludus.server.util) 在GWT模块XML中,在服务器上将ClientProxyGenerator更改为新版本
您已经准备好使用自定义异常,但是如果将此扩展集成到Restlet框架中,那就太好了。在Jerome Louvel和Thierry Boileau的帮助下,我创建了一个新的ClientProxyGenerator(),它支持针对GWT客户端的自定义异常 只需从ServerResourceProxy(ClientProxy)中的接口指定异常 瞧 可以立即在项目中使用此自定义ClientProxyGenerator() 并将其放在服务器上的包中(例如包com.ludus.server.util) 在GWT模块XML中,在服务器上将ClientProxyGenerator更改为新版本
您已经准备好处理您的自定义异常,但是如果将此扩展集成到Restlet框架中,那就太好了。在这个问题上,它仍然非常安静。。。Restlet/GWT还活着吗?有没有人在使用Restlet的GWT客户端中使用过服务器异常?嗨,罗兰,Restlet/GWT中对注释异常的支持还没有开发出来,但在技术上应该是可行的。你认为你能贡献吗?很高兴在这个过程中支持你。你好,杰罗姆,是的,我想我可以贡献。挑战不在于带注释的异常(我只能使用所描述的基本方法),而在于ClientProxyGenerator(因此GWT编译器的东西…)。我试图在我的项目中使用生成的源代码,但ServerResourceProxy_TypeSerializer存在问题。。。你有一个正在工作/正在编译的ServerResourceProxyImpl/ServerResourceProxy_类型序列化程序示例我可以使用吗?它在这个问题上保持了尴尬的安静。。。Restlet/GWT还活着吗?有没有人在使用Restlet的GWT客户端中使用过服务器异常?嗨,罗兰,Restlet/GWT中对注释异常的支持还没有开发出来,但在技术上应该是可行的。你认为你能贡献吗?很高兴在这个过程中支持你。你好,杰罗姆,是的,我想我可以贡献。挑战不在于带注释的异常(我只能使用所描述的基本方法),而在于ClientProxyGenerator(因此GWT编译器的东西…)。我试图在我的项目中使用生成的源代码,但ServerResourceProxy_TypeSerializer存在问题。。。您有一个可以使用的工作/编译ServerResourceProxyImpl/ServerResourceProxy\u类型序列化程序示例吗?
callback.onFailure(new ResourceException(getClientResource().getStatus()));