Google使用ÄÖÜ将自动完成与JSF错误映射

时间:2014-01-16 07:41:09

标签: jsf google-maps-api-3 primefaces character-encoding autocomplete

我们在JSF应用程序中使用谷歌地图自动完成功能,但是当我们选择öä的名称时,backingBean会获得例如。 Ã作为价值。我们已将网站的元信息设置为utf-8,但在这种情况下这没有帮助。

我们这样添加:

<script type="text/javascript"
        src="https://maps.googleapis.com/maps/api/js?v=3.exp&amp;sensor=false&amp;libraries=places&amp;key=AIzaSyChQPYNPhodC79W6-oGzlVgQJEwfFMG_bs" />
    <script type="text/javascript" charset="utf-8">
        function addGMapAutoComplete(componentId) {
            var component = document.getElementById('createRequest:' + componentId);
            if (component) {
                new google.maps.places.Autocomplete(component);
            }
        }
    </script>

并用作

<p:inputText id="pickupLocation"
                                            value="#{createRequest.pickupLocation}" required="true"
                                            onfocus="addGMapAutoComplete('location')"
                                            style="width:350px" />

任何人都可以帮助解决这个问题吗?

1 个答案:

答案 0 :(得分:0)

这是PrimeFaces的一个已知问题。它错误地使用服务器的默认编码(通常是ISO-8859-1)来解码ajax请求的POST请求数据,即使JSF / Facelets本身已经默认使用UTF-8到所有层。

要解决此问题,您需要在请求处理中尽早调用值"UTF-8"的{​​{3}}来手动将POST请求正文编码设置为UTF-8(参数之前)曾经解析过POST请求体)。最直接的方法是使用servlet过滤器:

@WebFilter("/*")
public class CharacterEncodingFilter implements Filter {

    @Override
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws ServletException, IOException {
        request.setCharacterEncoding("UTF-8");
        chain.doFilter(request, response);
    }

    // ...
}

或者,如果您恰好使用了JSF实用程序库ServletRequest#setCharacterEncoding(),那么只需将以下条目添加到您的webapp web.xml中即可使用其即用型OmniFaces

<filter>
    <filter-name>characterEncodingFilter</filter-name>
    <filter-class>org.omnifaces.filter.CharacterEncodingFilter</filter-class>
</filter>
<filter-mapping>
    <filter-name>characterEncodingFilter</filter-name>
    <url-pattern>/*</url-pattern>
</filter-mapping>