Не удается прочитать акцентированный символ из строки запроса

Я устанавливаю значение из queryString в свойство managedBean с помощью <f:viewParam>. Если я печатаю значение свойства, оно нормально работает для нормального символа. Но когда queryString содержит акцентированные символы, после установки значения в свойстве managedBean, если я печатаю значение этого свойства, акцентированные символы не отображаются должным образом.

Ниже приведен фрагмент кода.xhtml:

<f:metadata>
<f:viewParam id="requestString" name="requestString" value="#{aproveOrDenyController.requestString}" />
</f:metadata>

ManagedBean:

@ManagedBean(name = "aproveOrDenyController")
@ViewScoped
public class AproveOrDenyController extends BaseWebController implements Serializable 
{
private String requestString;


public final String getRequestString() {
    return requestString;
}
public final void setRequestString(String requestString) {
    this.requestString = requestString;
    System.out.println(this.requestString);
}
}

Если строка запроса содержит...&requestString=abcdefgh&....., то она печатает abcdefgh правильно. Но если строка запроса содержит...&requestString=SociétéGéniale&.., то она печатает SociétéGéniale, Но я хочу SociétéGéniale, Любой указатель будет очень полезен для меня.

Edit-1 сгенерированная ошибка:

19:52:49,594 ERROR [org.jboss.as.server] JBAS015956: Caught exception during boot: org.jboss.as.controller.persistence.ConfigurationPersistenceException: JBAS014676: Failed to parse configuration
at org.jboss.as.controller.persistence.XmlConfigurationPersister.load(XmlConfigurationPersister.java:141) [jboss-as-controller-7.1.1.Final.jar:7.1.1.Final]
at org.jboss.as.server.ServerService.boot(ServerService.java:266) [jboss-as-server-7.1.1.Final.jar:7.1.1.Final]
at org.jboss.as.controller.AbstractControllerService$1.run(AbstractControllerService.java:155) [jboss-as-controller-7.1.1.Final.jar:7.1.1.Final]
at java.lang.Thread.run(Unknown Source) [rt.jar:1.7.0_10]
Caused by: javax.xml.stream.XMLStreamException: ParseError at [row,col]:[8,5]
Message: JBAS014789: Unexpected element '{urn:jboss:domain:1.2}extensions' encountered
at org.jboss.as.controller.parsing.ParseUtils.unexpectedElement(ParseUtils.java:85) [jboss-as-controller-7.1.1.Final.jar:7.1.1.Final]
at org.jboss.as.server.parsing.StandaloneXml.readServerElement_1_1(StandaloneXml.java:351) [jboss-as-server-7.1.1.Final.jar:7.1.1.Final]
at org.jboss.as.server.parsing.StandaloneXml.readElement(StandaloneXml.java:127) [jboss-as-server-7.1.1.Final.jar:7.1.1.Final]
at org.jboss.as.server.parsing.StandaloneXml.readElement(StandaloneXml.java:100) [jboss-as-server-7.1.1.Final.jar:7.1.1.Final]
at org.jboss.staxmapper.XMLMapperImpl.processNested(XMLMapperImpl.java:110) [staxmapper-1.1.0.Final.jar:1.1.0.Final]
at org.jboss.staxmapper.XMLMapperImpl.parseDocument(XMLMapperImpl.java:69) [staxmapper-1.1.0.Final.jar:1.1.0.Final]
at org.jboss.as.controller.persistence.XmlConfigurationPersister.load(XmlConfigurationPersister.java:133) [jboss-as-controller-7.1.1.Final.jar:7.1.1.Final]
... 3 more

2 ответа

Декодирование строк запроса URI управляется контейнером сервлетов (Tomcat, JBoss, Glassfish и т. Д.). Это часто имеет значение по умолчанию ISO-8859-1. Вам необходимо настроить набор символов для декодирования строки запроса в контейнере сервлетов так, чтобы он использовался JSF/Facelets для кодирования ответов и запросов POST, что по умолчанию является UTF-8. В вашем случае кодировка строки запроса, по-видимому, использует стандарт по умолчанию ISO-8859-1. é символ существует в кодировке UTF-8 двух байтов 0xC3 а также 0xA9 которые в свою очередь представляют в ISO-8859-1 кодировку символов Ã а также © именно персонажи, которых вы видите. Это подтверждает, что ISO-8859-1 неправильно использовался вместо UTF-8.

Поскольку вы используете JBoss AS, вам нужно добавить следующую запись в <server> из JBoss' /standalone/configuration/standalone.xml между <extensions> а также <management> в:

<system-properties>
    <property name="org.apache.catalina.connector.USE_BODY_ENCODING_FOR_QUERY_STRING" value="true" />
</system-properties>

Это проинструктирует JBoss использовать ServletRequest#getCharacterEncoding() декодировать строку запроса вместо кодировки по умолчанию ISO-8859-1. Если это все еще не работает (что может случиться, когда вы используете PrimeFaces), то вам нужно в дополнение к вышеупомянутой записи конфигурации явно установить кодировку символов в UTF-8, а также использовать фильтр сервлета. На эту часть дан ответ в решении 1 ввода Unicode, полученного через компоненты ввода PrimeFaces, повреждены.

Другой возможной причиной является то, что выходной адресат, где System.out.println() заканчивает тем, что не использует UTF-8 для представления напечатанных символов. Это, в свою очередь, совершенно не связано с JSF и контейнером сервлетов. Вы также ничего не сказали о контексте System.out.println() работает, поэтому здесь сложно дать подходящий ответ. Но если бы это был, например, Eclipse, то вы могли бы настроить его, установив Window > Preferences > General > Workspace > Encoding для текстовых файлов в UTF-8.

Смотрите также:

В дополнение к предыдущему ответу вы можете попробовать добавить:

<system-properties>
    <property name="org.apache.catalina.connector.URI_ENCODING" value="UTF-8"/>
    <property name="org.apache.catalina.connector.USE_BODY_ENCODING_FOR_QUERY_STRING" value="true" />
</system-properties>

в файл конфигурации standalone.xml.

Другие вопросы по тегам