Сбой GWT RPC при запуске приложения с разных URL
Я использую URL для перехода к различным экранам внутри моего приложения GWT. Например:
http://127.0.0.1/home
http://127.0.0.1/info/contact-us
http://127.0.0.1/app/index.html
У меня есть сервлет, который обслуживает HTML, содержащий необходимый элемент сценария для GWT (мое имя модуля GWT - "app"):
<script type="text/javascript" language="javascript" src="/app/app.nocache.html">
</script>
Это прекрасно работает с GWT 2.6.1. В инструментах разработки браузера можно увидеть, что вызовы RPC сделаны на мой RemoteService
в http://127.0.0.1/app/rpc
Проблема в том, что при обновлении до GWT 2.8 конечная точка вызова RPC моего приложения теперь отличается и неверна, в зависимости от используемого URL-адреса. Например:
http://127.0.0.1/home -> http://127.0.0.1/rpc
http://127.0.0.1/info/contact-us -> http://127.0.0.1/info/rpc
http://127.0.0.1/app/index.html -> http://127.0.0.1/app/rpc
Для вышеуказанных URL-адресов модуль всегда правильно загружается и выполняется, однако в первых двух случаях RPC не выполняются. только последний URL позволяет моему приложению совершать вызовы RPC.
Конечная точка RPC может быть установлена путем приведения прокси службы на стороне клиента к ServiceDefTarget
и используя setServiceEntryPoint()
, Следующее:
ourInstance = (MyRemoteServiceAsync)GWT.create(MyRemoteService.class);
ServiceDefTarget serviceDefTarget = (ServiceDefTarget) ourInstance;
serviceDefTarget.setServiceEntryPoint("/app/rpc");
Однако полезная нагрузка запроса по-прежнему содержит ссылку на неверную базу модулей. Заголовки http, отправленные по запросу RPC, также имеют неверные значения:
X-GWT-Module-Base:http://127.0.0.1/foo/bar/
Есть ли способ заставить механизм RPC клиента использовать правильный URL-адрес RPC? /app/rpc
? Или, возможно, способ правильно установить модуль-базу?
ОБНОВЛЕНИЕ 1
Видя такое же поведение в GWT 2.7.
Кроме того, при развертывании в WAR <module-hash>.cache.js
файл не загружается, потому что он также запрашивается относительно URL. Это очень плохо, потому что это означает, что код модуля не будет кэшироваться, так как этот URL каждый раз отличается. Исправление должно быть сделано в селекторе <module>.nocache.js
, Кто-нибудь на самом деле использует GWT с URL-ссылками в реальном мире?
1 ответ
Указав <meta>
элемент в <head>
Элемент html документа, загрузчик jocascript селектора nocache.js выберет правильный модуль baseUrl. BaseUrl должен быть полностью указанным абсолютным URL и заканчиваться /
,
Для моего примера точный элемент был:
<head>
...
<meta name="gwt:property" content="baseUrl=http://127.0.0.1/app/" />
...
</head>