2012-06-21 3 views
3

Я переношу существующее приложение GWT, работающее на OSGi (Equinox) и Pax-web, для использования Declarative Services вместо программного Tracker службы.Проблемы с GWT в OSGi + Pax-Web с использованием декларативных служб

Я использую Pax-Web в равноденствии. Приложение GWT, основанное на WAR, загружается без проблем приложением PAX-WEB War, но вы не можете иметь декларативные услуги в этом modus operandis.

Я успешно реорганизовал все сервлеты из войны и преобразовал их в декларативные службы OSGi (<provide interface="javax.servlet.Servlet"/>). Таким образом, я избавился от всего беспорядочного кода ServiceTracker и определенных зависимостей OSGi в сервлетах. Я также реплицировал все другие функции web.xml, чтобы зарегистрировать фильтр, обслуживать статический контент и страницу приветствия, используя информацию о [1]

На данный момент это нормально, должно работать, но у меня проблемы с PAX-WEB и как GWT пытается загрузить свои ресурсы:

При загрузке дескрипторов сериализации GWT загружает файл политики сериализации из локального контекста. В моем случае он пытается решить такие ресурсы, как это: /ctx/ctx/62394587E47773FB1594FF.gwt.rpc Этот ресурс создан компилятором GWT и помещен под: /войн/CTX/CTX/ресурсы ...

Прежде, используя стандартное отображение wab (Webapp-Context: /ctx, Webapp-Root: /war), gwt правильно найдет свои ресурсы. Теперь, когда я использую программное отображение ресурса:

DefaultResourceMapping resourceMapping = new DefaultResourceMapping(); 
resourceMapping.setAlias("/ctx"); 
resourceMapping.setPath("/war"); 

GWT не удается загрузить Resouce и выдает следующее сообщение об ошибке:

2012-06-20 12:46:36.283:INFO:/:AbcProxy: ERROR: The serialization policy file '/ctx/ctx/600000000000000773FB1594FF.gwt.rpc' was not found; did you forget to include it in this deployment? 
2012-06-20 12:46:36.283:INFO:/:AbcProxy: WARNING: Failed to get the SerializationPolicy '600000000000000773FB1594FF' for module 'https://localhost:8443/ctx/ctx/'; a legacy, 1.3.3 compatible, serialization policy will be used. You may experience SerializationExceptions as a result. 

[нотабене Последнее предложение должно гласить: «В результате вы столкнетесь с чертой проблем с сериализацией»]

Я отследил проблему с HttpServiceContext, загружая этот ресурс и интрепретируя путь как файл, а не как URL-адрес относительно программный веб-контекст:

getting resource: [/mx/mx/6ECAD5B3A6F908CE17E47773FB1594FF.gwt.rpc] 
HttpServiceContext | not a URL or invalid URL: [/ctx/ctx/600000000000000773FB1594FF.gwt.rpc], treating as a file path 
DefaultHttpContext | Searching bundle [bundle] for resource [/ctx/ctx/600000000000000773FB1594FF.gwt.rpc] 

Это, очевидно, не удается, так как этот ресурс находится в/войнах/CTX/CTX/в расслоении файловой системы. Это, кажется, относится к ошибке PAXWEB-314 [2], реализация которых является превращением относительного пути в пути к файлу:

// IMPROVEMENT start PAXWEB-314 
257    try { 
258     resource = new URL(path); 
259     LOG.debug("resource: [" + path + "] is already a URL, returning"); 
260     return resource; 
261    } 
262     catch (MalformedURLException e) { 
263      // do nothing, simply log 
264      LOG.debug("not a URL or invalid URL: [" + path + "], treating as a file path"); 
265    } 
266    // IMPROVEMENT end PAXWEB-314 

Есть ли способ обойти эту проблему? Кто-нибудь использует GWT и PAX-WEB, используя OSGi DS вместо WAB? Один из возможных способов - скопировать/war/ctx, созданный компилятором GWT, обратно в/ctx, но я хотел бы найти достойное решение, прежде чем идти в направлении взлома.

Любые идеи?

1 - https://github.com/ops4j/org.ops4j.pax.web/blob/master/samples/whiteboard/src/main/java/org/ops4j/pax/web/extender/samples/whiteboard/internal/Activator.java [2] - http://team.ops4j.org/browse/PAXWEB-314

+0

Похоже есть проблема с загрузкой классов и GWT при использовании в контейнере OSGi. Это может быть связано с вашей проблемой. [GWT Issue 1888] (http://code.google.com/p/google-web-toolkit/issues/detail?id=1888) и [GWT OSGI на clazzes.org] (http: //svn.clazzes. org/svn/gwt/tags/gwt-osgi-2.4.0.2 /) может представлять интерес. – pauli

+0

@pauli спасибо. Я выяснил, как PAX-WEB обрабатывает контекст веб-приложения. В принципе, когда у вас есть файл войны, вы можете установить 'Webapp-Context' в . GWT использует 'String contextPath = request.getContextPath();' для создания местоположения для скомпилированных ресурсов, но поскольку PAX-WEB не предоставляет этого, GWT его не находит. Мы работали над этим, вручную копируя скомпилированные ресурсы в '..' – maasg

ответ

0

Я сделал некоторые дальнейшие раскопки.

На GWT, это соответствующий кусок кода, отвечающий за загрузки этих файлов политики: [1]

protected SerializationPolicy doGetSerializationPolicy(
     HttpServletRequest request, String moduleBaseURL, String strongName) { 
    // The request can tell you the path of the web app relative to the 
    // container root. 
    String contextPath = request.getContextPath(); 
    String modulePath = null; 
    if (moduleBaseURL != null) { 
     try { 
     modulePath = new URL(moduleBaseURL).getPath(); 
     } catch (MalformedURLException ex) { 
     // log the information, we will default 
     log("Malformed moduleBaseURL: " + moduleBaseURL, ex); 
     } 
    } 
... 

Я подозревал, что contextPath быть потенциальным кандидатом подозреваемый в этом случае. Чтобы проверить эту теорию, я развернул простой сервлет, который сбрасывает свой контекст. Я развернул его с помощью WAB (MANIFEST: Webapp-Context + web.xml). В этом развертывании сервлет сообщает: [getContextPath] -> [/ ctx]

Затем изменилось развертывание на OSGi-ds с программным активатором, содержащим сопоставление ресурсов. DefaultResourceMapping resourceMapping = new DefaultResourceMapping(); resourceMapping.setAlias ​​("/ ctx"); resourceMapping.setPath ("/ war");

В этом случае отчеты сервлетные: [getContextPath] -> []

В переводе на вопрос GWT -> когда GWT развертывается с WAB, он находит свой конфиг в/CTX/приложение и когда я использую программное сопоставление ресурсов, которое он ищет в/app и поэтому не находит его ресурсов.

Итог: В PAX-WEB Webapp-Context не эквивалентен псевдониму. Псевдоним не заполняет ContextPath так же, как это делает Webapp-Context.

только текущей работы вокруг этой ситуации, чтобы позволить строить копии, остающейся GWT-сгенерированные файлы на один уровень вниз (исключая контекст приложения путь)

PS: После Ахим Nierbeck от Pax-сети, то OSGi спецификации эволюционируют управлять приложение-CTX вопросом: http://wiki.osgi.org/wiki/WebExperience

[1] http://code.google.com/p/google-web-toolkit/source/browse/trunk/user/src/com/google/gwt/user/server/rpc/RemoteServiceServlet.java?spec=svn5045&r=5045