Использование GWT RPC из GWTTestCase с использованием Guice - PullRequest
0 голосов
/ 15 мая 2010

Я настроил свое приложение GWT с Guice, как описано здесь . С этой настройкой приложение работает нормально.

Однако сейчас я хотел бы получить GWTTestCase для вызова службы с использованием GWT RPC. Для этого я сделал это,

  • Обновлен мой JUnit.gwt.rpc, так что URL-адрес службы отображается на GuiceRemoteServiceServlet
  • Добавлен метод init () в GuiceRemoteServiceServlet для инициализации Инжектора согласно этому комментарию

К сожалению, я все еще получаю ошибку,

com.google.inject.ProvisionException: Guice provision errors:

Caused by: com.google.inject.OutOfScopeException: Cannot access scoped object. Either we are not currently inside an HTTP Servlet request, or you may have forgotten to apply com.google.inject.servlet.GuiceFilter as a servlet filter for this request.
    at com.google.inject.servlet.GuiceFilter.getContext(GuiceFilter.java:132)
    at com.google.inject.servlet.GuiceFilter.getRequest(GuiceFilter.java:118)
    at com.google.inject.servlet.InternalServletModule$1.get(InternalServletModule.java:35)
.....

Объект, который он пытается предоставить, - это ServletContext. Причина ошибки заключается в том, что GuiceFilter не был вызван, поэтому ServletContext не был привязан к ThreadLocal.

Есть ли способ обойти это?

1 Ответ

1 голос
/ 18 мая 2010

В среде Junit вы не получаете две вещи, которые вы обычно получаете из контейнера сервлета: помощь в настройке / уничтожении из GuiceServletContextListener и фильтрацию GuiceFilter, поэтому вам нужно сделать эти биты самостоятельно .

Вам нужно создать еще один сервлет, который обернет ваш сервлет и выполнит всю настройку / фильтрацию, которую вы обычно выполняете в контейнере сервлета; я рекомендую что-то вроде этого:

Предположим, ваш сервлет называется AdriansGuicedGwtServiceServlet. Затем создайте это в своей тестовой директории:

public class TestAdriansGuicedGwtServiceServlet extends AdriansGuicedGwtServiceServlet {
  private GuiceFilter filter;

  @Override
  public void init() {
    super.init();

    // move your injector-creating code here if you want to
    // (I think it's cleaner if you do move it here, instead of leaving
    //  it in your main servlet)

    filter = new GuiceFilter();
    filter.init(new FilterConfig() {
      public String getFilterName() {
        return "GuiceFilter";
      }

      public ServletContext getServletContext() {
        return TestAdriansGuicedGwtServiceServlet.this.getServletContext();
      }

      public String getInitParameter(String s) {
        return null;
      }

      public Enumeration getInitParameterNames() {
        return new Vector(0).elements();
      }
    });
  }

  @Override
  public void destroy() {
    super.destroy();
    filter.destroy();
  }

  private void superService(ServletRequest req, ServletResponse res)
      throws ServletException, IOException {
    super.service(req, res);
  }

  @Override
  public void service(ServletRequest req, ServletResponse res) 
      throws ServletException, IOException {
    filter.doFilter(new FilterChain() {
      public void doFilter (ServletRequest request, ServletResponse response)
          throws IOException, ServletException {
        superService(request, response);
      }
    });
  }
}

И тогда в вашем Junit.gwt.rpc есть карта в TestAdriansGuicedGwtServiceServlet вместо вашего реального сервлета.

...