Что ж, после пары туров мы наконец нашли решение нашей проблемы, с которой я хочу поделиться в случае, если она может помочь другим.
Прежде всего я должен упомянуть помощь Колина Алворта, без его поддержки это решение было бы вообще невозможно.
Также я должен отметить, что я не очень горжусь окончательным решением, но оно работает для нас, и на данный момент это лучшее, что у нас есть.
Что мы наконец-то сделали, так это то, что, как отмечает Колин в прошлом посте, заменял GWT.create каждого из наших интерфейсов службы, чтобы создать вместо него интерфейс GenericBigService.
Итак, наш первый патч выглядит так:
1) Создайте интерфейс GenericBigService, который расширяет все имеющиеся у нас Сервисные интерфейсы (на данный момент 52 интерфейса), а также создайте его брата Async. мы сделали это через фитомный скрипт.
Итак, наш GenericBigInterface выглядит так:
package com.arballon.gwt.core.client;
import com.google.gwt.user.client.rpc.RemoteService;
public interface GenericBigService extends RemoteService,
AccountingService,
ActionClassifierService,
AFIPWebService,
AnalyticalService,
AuthorizationService,
BudgetService,
BusinessUnitService,
CatalogPartService,
CategoryService,
ClientDepositService,
.....
.....
{ }
2) У нас есть внутренний статический класс Util в каждом интерфейсе Сервиса для создания экземпляра Async, там мы заменяем GWT.create для создания GenericBigInterface.
Один из наших сервисных интерфейсов выглядит так:
public interface FinancialPeriodBalanceCategoryService extends RemoteService {
/**
* Utility class for simplifying access to the instance of async service.
*/
public static class Util {
private static FinancialPeriodBalanceCategoryServiceAsync instance;
public static FinancialPeriodBalanceCategoryServiceAsync getInstance() {
if (instance == null) {
instance = GWT.create(GenericBigService.class);
((ServiceDefTarget)instance).setServiceEntryPoint(GWT.getModuleBaseURL()+"FinancialPeriodBalanceCategoryService");
}
return instance;
}
}
мы должны выполнить вызов serServiceEntyPoint, чтобы сохранить наш web.xml неизменным.
Когда мы впервые компилируем это, оно компилируется нормально, но это не работает, потому что во время выполнения серверный вызов выдает исключение:
IncompatibleRemoteServiceException Blocked attempt to access interface GenericBigService
, который не реализован в FinancialPeriodBalanceCategoryService
Что ж, это было абсолютно правильно, мы называем сервис с интерфейсом, который он не реализует, и вот тут-то и появляется некрасивая часть.
В тот момент мы не смогли найти лучшее решение, которое мы можем написать, которое мы решили реализовать:
Мы заменяем RPC.java нашей собственной копией и заменяем код следующим образом:
в методе decodeRequest мы сделали:
if (type != null) {
/*if (!implementsInterface(type, serviceIntfName)) {
// The service does not implement the requested interface
throw new IncompatibleRemoteServiceException(
"Blocked attempt to access interface '" + serviceIntfName
+ "', which is not implemented by '" + printTypeName(type)
+ "'; this is either misconfiguration or a hack attempt");
}*/
if (!implementsInterface(type, serviceIntfName)) {
if(!serviceIntfName.contains("GenericBigService")){
throw new IncompatibleRemoteServiceException(
"Blocked attempt to access interface '" + serviceIntfName
+ "', which is not implemented by '" + printTypeName(type)
+ "'; this is either misconfiguration or a hack attempt");
}
}
Выгода от этого была:
1) у нас ушло 1 час 20 минут на состязание, а на 6 перестановок - всего 20 минут.
2) В devMode все начинает работать быстрее. Запуск остается более или менее неизменным, но выполнение после его запуска идет очень хорошо.
3) Другим немаловажным результатом было уменьшение размера компиляции: мы сократили оставшийся сегмент с 6 МБ до 1,2 МБ, мы сократили размер всей компиляции JS в aprox. От 50% до 60%.
Мы действительно довольны GWT-RPC и не хотим его оставлять, но typeSerializer на самом деле была проблемой в основном из-за размера JS, который получается.
С этим решением, я знаю, не очень элегантно, но оно работает, и оно работает хорошо.
Еще раз спасибо Колин за вашу помощь!
С уважением
Daniel