Джерси Guice JSP как? - PullRequest
       5

Джерси Guice JSP как?

21 голосов
/ 26 августа 2011

Я использую tomcat 6, jersey 1.8 с jersey guice и guice 3. У меня проблемы с использованием JSP с моими настройками.У меня есть сервлет «Состояние», служащий простым сервлетом, настроенным с помощью web.xml, сервлета-джерси, настроенного с помощью GuiceFilter, который возвращает ответ на просмотр jsp (jsp - это /diff/index.jsp) для отображения результата как:

Viewable view = new Viewable("/diff/index.jsp", null); 
Response response = Response.ok().entity(view).build(); 
return response;

Все это прекрасно работает с простым Джерси, когда я пытаюсь получить его с интеграцией с Guice, JSP дает сбой, и я получаю ответ 404 с «Запрошенный ресурс (/diff/index.jsp)недоступен."

Используя отладчик, я вижу, что вызываемый JSPTemplateProcessor получил RequestDispatcher со StandardWrapper, который имеет «isJspServlet = true» и «jspFile = null».

Файл web.xml выглядит следующим образом:

  <servlet>
        <display-name>Status Page</display-name>
        <servlet-name>Status</servlet-name>
        <servlet-class>my.BaseStatusPage</servlet-class>
        <load-on-startup>1</load-on-startup>
    </servlet>

    <servlet-mapping>
        <servlet-name>Status</servlet-name>
        <url-pattern>/Status/*</url-pattern>
    </servlet-mapping>

   <filter>
        <filter-name>guiceFilter</filter-name>
        <filter-class>com.google.inject.servlet.GuiceFilter</filter-class>
    </filter>
    <filter-mapping>
        <filter-name>guiceFilter</filter-name>
        <url-pattern>/REST/*</url-pattern>
    </filter-mapping>
    <listener>
        <listener-class>my.GuiceServletConfig</listener-class>
    </listener>

====================

GuiceServletConfig:

public class GuiceServletConfig extends GuiceServletContextListener { 

  @Override 
  protected Injector getInjector() { 
    return Guice.createInjector(new JerseyServletModule() { 

      @Override 
      protected void configureServlets() { 
        bind(DiffPage.class);// the jersey servlet 

        Map<String, String> params = new HashMap<String, String>(); 
        params.put(PROPERTY_PACKAGES, "my"); 
        params.put(PROPERTY_WEB_PAGE_CONTENT_REGEX, ".*\\.jsp"); 
        params.put(FEATURE_REDIRECT, "true"); 
        params.put(FEATURE_IMPLICIT_VIEWABLES, "true"); 
        params.put(RESOURCE_CONFIG_CLASS, "com.sun.jersey.api.core.PackagesResourceConfig"); 

        serve("/REST/*").with(GuiceContainer.class, params); 
      } 
    }); 
  } 

=========================== *

Благодаря наличию фильтра GuiceContainer сервлеты доставляются из ИнтернетаОшибка XMLДобавление сервлета jsp в web.xml не принесло много пользы.

Кстати, я прочитал ветку от 25 июля 2010 года в списке рассылки о джерси , но у меня это не сработало.

Помощь оценена Спасибо, Eishay

- Приложение. Я вызываю JSP из кода бизнес-логики.Некрасиво но работает:

  protected Response renderJsp(HttpServletRequest request,
      HttpServletResponse response, ServletConfig servletConfig) {
    request.setAttribute("org.apache.catalina.jsp_file", "/diff/index.jsp");
    Class jspServletClazz;
    try {
      jspServletClazz = forName("org.apache.jasper.servlet.JspServlet");
      Object jspServlet = jspServletClazz.getConstructor().newInstance();
      jspServletClazz.getMethod("init", ServletConfig.class).invoke(jspServlet,
          servletConfig);
      jspServletClazz.getMethod("service", HttpServletRequest.class,
          HttpServletResponse.class).invoke(jspServlet, request, response);
    } catch (Exception e) {
      throw new RuntimeException(e);
    }
    return Response.ok().build();
  }

1 Ответ

4 голосов
/ 08 июня 2012

Проблема связана с настройкой Guice для «обслуживания» запросов «сервлетом»: сервлет блокирует цепочку запросов и предотвращает передачу запросов, таких как статическое содержимое и вызовы jsp, в обработчики по умолчанию.

Решение состоит в том, чтобы настроить Guice так, чтобы он «фильтровал» запросы «через фильтр»:

web.xml

<listener>
    <listener-class>my.guice.config.package.GuiceServletConfig</listener-class>
</listener>

<filter>
    <filter-name>guiceFilter</filter-name>
    <filter-class>com.google.inject.servlet.GuiceFilter</filter-class>
</filter>

<filter-mapping>
    <filter-name>guiceFilter</filter-name>
    <url-pattern>/*</url-pattern>
</filter-mapping>

Обратите внимание, что это filter конфигурация в отличие от конфигурации servlet.

GuiceServletConfig

public class GuiceServletConfig extends GuiceServletContextListener {

    @Override
    protected Injector getInjector() {
        return Guice.createInjector(new JerseyServletModule() {

            @Override
            protected void configureServlets() {

                /* Bindings */
                bind(JerseyResource.class);

                /* Parameters*/
                Map<String, String> params = new HashMap<String, String>(); 
                params.put(JSP_TEMPLATES_BASE_PATH, "/WEB-INF/jsp"); 
                params.put(FEATURE_FILTER_FORWARD_ON_404, "true");

                filter("/*").through(GuiceContainer.class, params);
            } 
        });
    }
}

Обратите внимание на использование filter().through(); вместо serve().with();.

Это позволяет передавать статические запросы и запросы jsp (и включает в себя!) На следующую ссылку в цепочке фильтров и, в конечном итоге, на обработчики содержимого по умолчанию.

Также обратите внимание на использование выше более свежего ServletContainer.FEATURE_FILTER_FORWARD_ON_404 вариант в качестве альтернативы более сложному ServletContainer.PROPERTY_WEB_PAGE_CONTENT_REGEX, когда вас устраивают местоположения для статического содержимого по умолчанию.

Вы по-прежнему можете использовать другие параметры, перечисленные в исходном вопросе.

Для следующего шага вы также можете обратиться к этому вопросу , конкретно касающемуся проблемы, с которой я столкнулся при добавлении Guice AOP в эту конфигурацию для работы вместе с Guice Dependency Injection, службами REST Jersey, статическим контентом (JavaScript, CSS, изображения) и возвращаемые JSP Viewables.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...