着信GWT呼び出しの処理には、SpringMVCコントローラーまたはサーブレットを使用すると思います。次のロジックを持つことができます
try{
// decode payload from GWT call
com.google.gwt.user.server.rpc.RPC.decodeRequest(...)
// get spring bean responsible for actual business logic
Object bean = applicationContext.getBean(beanName);
// execute business logic and encode response
return RPC.invokeAndEncodeResponse(bean, ….)
} catch (com.google.gwt.user.server.rpc.UnexpectedException ex) {
// send unexpected exception to client
return RPC.encodeResponseForFailure(..., new MyCustomUnexpectedException(), …) ;
}
この場合の解決策
HttpServletRequest request = getRequest() ;
if (request.getRequestedSessionId() != null && !request.isRequestedSessionIdValid()) {
return RPC.encodeResponseForFailure(..., new MyCustomSessionExpiredException(), …) ;
} else {
// first code snippet goes here
}
次に、クライアント側のコードでカスタムセッションの期限切れの例外をキャッチします。RPCを直接使用しない場合は、GWTとSpringの間のブリッジ実装に関する詳細を提供してください。
また、GWTコンパイラにMyCustomSessionExpiredExceptionタイプをシリアル化ホワイトリストに含めるように強制する必要があります(GWTセキュリティポリシーがクライアント側への例外の伝播を停止する場合を防ぐため)。解決策:各同期インターフェイスの各メソッドシグネチャにMyCustomSessionExpiredExceptionタイプを含めます。
@RemoteServiceRelativePath("productRpcService.rpc")
public interface ProductRpcService extends RemoteService {
List<Product> getAllProducts() throws ApplicationException;
void removeProduct(Product product) throws ApplicationException;
}
MyCustomSessionExpiredException extends ApplicationException
次に、クライアント側のコードにポップアップを表示します。
public class ApplicationUncaughtExceptionHandler implements GWT.UncaughtExceptionHandler {
@Override
public void onUncaughtException(Throwable caught) {
if (caught instanceof MyCustomSessionExpiredException) {
Window.alert("Session expired");
}
}
}
// Inside of EntryPoint.onModuleLoad method
GWT.setUncaughtExceptionHandler(new ApplicationUncaughtExceptionHandler());