Кодировка UTF-8 на страницах JSP проекта AppEngine с момента обновления до Java 8 - PullRequest
0 голосов
/ 14 сентября 2018

Я недавно обновил большой проект Java AppEngine с Java 7 до Java 8. После этого org.eclipse.jetty.servlet.ServletHandler.updateMappings начал выдавать это исключение:

java.lang.IllegalStateException: такого сервлета нет: jsp

После некоторого исследования кажется, что удаление этого блока кода из web.xml решает эту проблему:

 <jsp-config>
    <jsp-property-group>
        <url-pattern>*.jsp</url-pattern>
        <page-encoding>UTF-8</page-encoding>
    </jsp-property-group>
 </jsp-config>

Однако после удаления страницы не кодируются в формате UTF-8, поэтому символы не в ascii отображаются неправильно.

Я попытался добавитьследующие варианты JSP:

<%@ page contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>

Я также вошел в контроллер и попытался установить там кодировку символов.Конечная точка для обслуживания файла JSP выглядит следующим образом:

@GET
@Path("{subResources: .+}")
public Viewable foo(@Context HttpServletRequest request, @Context HttpServletResponse response) {
    ...
    return new Viewable("/index.jsp", map);
}

Я также пытался создать фильтр и настроить кодирование через него, но это также не имело никакого эффекта.Когда я использую инспектор сети в своем браузере, заголовок Content-Type возвращается как text / html; charset = utf-8 ... только текст неправильный, какПредполагалось, что это будет ascii где-то вдоль цепи.

В проекте используются Guice и Jersey.К сожалению, это очень большой и сложный проект, и я не могу предоставить полный исходный код или меньший проект, который воспроизводит проблему.Другая часть файла web.xml настраивает Guice следующим образом:

<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>

<listener>
    <listener-class>com.myproject.GuiceConfig</listener-class>
</listener>

Затем существует Guice JerseyServletModule , который настраивает все дальше, включая блок, подобный этому:

    jerseyParams.put("com.sun.jersey.config.property.packages", StringUtils.join(packages, ";"));
    jerseyParams.put("com.sun.jersey.api.json.POJOMappingFeature", "true");
    jerseyParams.put(ServletContainer.PROPERTY_WEB_PAGE_CONTENT_REGEX, "(/(tportal|images|styles|jsp)/.*|.*html|.*jsp|" +
            ".*ico|.*png|.*jpg|.*css|.*js|.*txt|.*xml)");

    filterRegex("^((?!^\\/(admin|_ah)((\\/\\w+)|\\/?$)).)*$").through(GuiceContainer.class, jerseyParams);

Последнее, что нужно добавить, это то, что некоторые библиотеки, используемые проектом, устарели.В идеале я бы не обновлял то, что вносит критические изменения в более поздние версии, если таковые имеются.Например, используется версия 1.11 джерси и сервера джерси.Я не пробовал обновиться до 1.19.4 , чтобы узнать, есть ли критические изменения или это поможет вообще.

Вот некоторые похожие посты, на которые я ссылался в своих попыткахразрешите это:

...