Почему не работает просто автоматическое подключение поля в сервлете GWT в Spring? - PullRequest
4 голосов
/ 20 января 2012

Простая пометка поля как @Autowired в сервлете GWT не работает должным образом.Код скомпилируется, и веб-приложение запустится - это означает, что Spring успешно смог автоматически связать поле, но когда сервлет на самом деле поражен клиентским кодом, он выдаст NullPointerException - как будто есть другая, неинициализированнаякопия сервлета, в который попалиБазовый класс.Другой способ заключался в использовании AspectJ и аннотации @Configurable Spring.Здесь была задействована очень небольшая конфигурация, и она просто волшебным образом сработала.

Мой вопрос: почему просто не выполняется автоматическая разводка поля, как задумано?Что делает GWT, и это приводит к поломке.

Ответы [ 3 ]

4 голосов
/ 20 января 2012

Код скомпилируется и веб-приложение запустится - это означает, что Spring успешно смог автоматически связать поле

Не обязательно.Веб-контейнер может создавать экземпляры сервлета без помощи Spring.С чем вы могли бы столкнуться:

, но когда сервлет на самом деле поражен клиентским кодом, он выдаст исключение NullPointerException - как если бы была другая неинициализированная копия поражаемого сервлета.

попробуйте переопределить init сервлета ():

@Override
public void init(ServletConfig config) throws ServletException {
    super.init(config);

    WebApplicationContextUtils.getWebApplicationContext(config.getServletContext())
        .getAutowireCapableBeanFactory().autowireBean(this);
}
1 голос
/ 20 января 2012

Когда служба RPC вызывается из клиента, "серверная сторона", просматривая вызываемый URL и отображение сервлетов, найдет класс, создаст экземпляр и будет обслуживать запрос.То есть, если у вас есть аннотация @Autowired, или у вас уже есть экземпляр класса RPC в контексте Spring, это не имеет значения.Новый экземпляр будет создан, и он не будет «знать» о Spring.

Я решаю эту проблему, реализуя класс, расширяющий RemoteServiceServlet и реализующий Controller (из Spring MVC) и ServletContextAware.Таким образом, вы можете отобразить каждую службу RPC по URL-адресу, используя подход Spring MVC, например:

<bean id="publicUrlMapping"
        class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping">
        <property name="mappings">
          <props>
            <prop key="/myFirstRpc">firstRpcServiceBeanRef</prop>
            <prop key="/mySecondRpc">secondRpcServiceRef</prop>
          </props>
        </property>
    </bean>

Вы также избегаете объявлений для каждого отдельного сервлета RPC в web.xml, отображения чистые, и у вас естьВесенний впрыск.Вы объявляете только одно отображение в web.xml для org.springframework.web.servlet.DispatcherServlet, которое будет обслуживать все вызовы RPC.

В Интернете есть несколько примеров с объяснением GWT RPC и Spring MVC-контроллераинтеграция.

Надеюсь, это поможет.

0 голосов
/ 14 августа 2013

Оказывается, что при использовании Spring, по крайней мере, есть НАМНОГО более простой способ сделать это, так что вы можете использовать @Autowired, и он не требует массивной конфигурации или базовых классов. Предостережение заключается в том, что вы также должны использовать AspectJ. Вот что вам нужно для вашего сервлета GWT:

@Configurable
public class MyGwtServiceImpl extends RemoteServiceServlet implements MyGwtService
{
  @Autowired
  private MyService service;

  // ...
}

И в конфигурации Spring убедитесь, что у вас также есть:

   <!-- enable autowiring and configuration of non-spring managed classes, requires AspectJ -->
   <context:spring-configured/>

Одно последнее замечание. Если вы также используете Spring Security с вашим приложением GWT (и в ваших сервлетах GWT), вам необходимо убедиться, что вы определили правильный режим, чтобы убедиться, что переплетение AspectJ выполнено правильно (т.е. вы получаете как обработку аннотации @Secured, так и @ Автоматическая обработка) вам потребуется:

   <!-- turn on spring security for method annotations with @Secured(...) -->
   <!-- the aspectj mode is required because we autowire spring services into GWT servlets and this
        is also done via aspectj. a server 500 error will occur if this is changed or removed. -->
   <security:global-method-security secured-annotations="enabled" mode="aspectj"/>
...