返回带问号的中文 Orbeon 表格

Orbeon form in chinese returned with question marks

我在 Tomcat 7.0 上的 SAP Commerce (Hybris) 中使用 ORBEON 2018.2.3.201905172253 PE。当 Hybris 使用 Orbeon 应用程序创建新表单并获取中文内联 HTML 时,我得到的是问号而不是中文字符。

URL: http://localhost:9001/orbeon/fr/yforms/myform/new?orbeon-embeddable=true&fr-language=zh-Hans 方法:获取 Headers: [ { "key":"hybris-Username", "value":"-" }, { "key":"hybris-Group", "value":"-" }, { "key":"hybris-Roles", "value":"-" }, { "key":"Orbeon-Client", "value":"portlet" }, { "key":"hybris-Proxy-09e4ff02-4715-4547-8f81-30082598eec9", "value":“37bb0017-2675-4617-945d-6693bdae8eb9” }, { "key":"Content-Type", "value":"text/html;charset=UTF-8" } ]

我发现 Tomcat 7 中有一个关于汉字的已知问题:

https://books.google.co.nz/books?id=kNVe8lzTec0C&pg=PA166&lpg=PA166&dq=webapp+http+request+chinese+question+marks&source=bl&ots=F11m7FJGYD&sig=ACfU3U1fufLJggVpnu4iUFT9SUJ6SdhqmA&hl=en&sa=X&ved=2ahUKEwjJq5L-_8njAhVi7nMBHXnMD0sQ6AEwAnoECAkQAQ#v=onepage&q=webapp%20http%20request%20chinese%20question%20marks&f=false

显然,Orbeon 包含一种使用 web.xml 文件中的 oxf.xforms.renderer.default-encoding 参数将字符编码设置为 UTF-8 的方法:

https://doc.orbeon.com/xforms/filter

我已经在 web.xml 中尝试过,并从 Orbeon 应用程序中获得了相同的结果。我什至使用 Postman 执行了相同的请求来检查它是否是我的 Hybris 店面的集成问题,但结果是一样的。

这是我的摘录 web.xml:

    <filter>
        <filter-name>orbeon-xforms-filter</filter-name>
        <filter-class>org.orbeon.oxf.servlet.OrbeonXFormsFilter</filter-class>
        <!-- Uncomment this for the separate WAR deployment -->

        <init-param>
            <param-name>oxf.xforms.renderer.context</param-name>
            <param-value>/orbeon</param-value>
        </init-param>
        <init-param>
            <param-name>oxf.xforms.renderer.default-encoding</param-name>
            <param-value>UTF-8</param-value>
        </init-param>
        <!-- End separate WAR deployment -->
    </filter>
    <filter-mapping>
        <filter-name>orbeon-xforms-filter</filter-name>
        <url-pattern>/xforms-jsp/*</url-pattern>
        <!--Servlet 2.4 configuration allowing the filter to run upon forward in addition to request-->
        <dispatcher>REQUEST</dispatcher>
        <dispatcher>FORWARD</dispatcher>
    </filter-mapping>

将过滤器的 url-pattern 更改为“/orbeon/fr/yforms/*” 破坏了整个事情,我什至无法用英文呈现表格。

在 Java 中调试请求时,我尝试将 HttpRequest object 的字符编码设置为 UTF-8。相同的结果。

我也试过这些,但效果不佳:

• Set the URIEncoding attribute on the element in server.xml to URIEncoding="UTF-8".

• Set the useBodyEncodingForURI attribute on the element in server.xml to true.

与此相关:

该主题的答案解释了我如何本地化我的表单。

最奇怪的是 URL 的响应确实包含一些中文字符:下拉语言选择器的标签。所有其他标签都是问号。超级奇怪!

我想知道如何通过更改我的 Tomat 配置或我的 Orbeon 应用程序配置来解决此问题。

谢谢,

大卫

好吧,正如预期的那样,这个问题与 Orbeon 无关。

在我的 Spring 控制器中,从数据库中获取表单的方法使用 @ResponseBody 进行了注释。 Controller 返回的 String 处于完美状态,包含正确的中文字符,但响应对象随后被 Spring 转换器拦截。

@RequestMapping(method = RequestMethod.GET, value = ...")
    @ResponseBody
    public String getFormDefinition(@PathVariable final String aaa, @PathVariable final String aaa,
            @RequestParam(value = "document", required = false) final String aaa, final HttpServletResponse response)
                    throws ServletException, IOException, YFormServiceException
    {
        return "html content";
    }

当有@ResponseBody 注释时,响应由Spring 的消息转换器处理。默认转换器列于此处:https://www.baeldung.com/spring-httpmessageconverter-rest

其中一个转换器是神奇的 StringHttpMessageConverter。如果你查看它的源代码,你可以看到它使用 ISO-8859-1 作为默认字符集。这些转换器处理的每个响应都将使用不支持中文字符的 ISO-8859-1 进行编码。

修复:

在我的网站 spring 配置文件中添加了:

<mvc:annotation-driven>

      <mvc:message-converters register-defaults="false">
        <bean class="org.springframework.http.converter.ByteArrayHttpMessageConverter"/>
         <bean class="org.springframework.http.converter.ResourceHttpMessageConverter"/>
         <bean class="org.springframework.http.converter.xml.SourceHttpMessageConverter"/>
         <bean class="org.springframework.http.converter.StringHttpMessageConverter">
            <constructor-arg index="0" name="defaultCharset" value="UTF-8"/>
         </bean>
         <bean class="org.springframework.http.converter.FormHttpMessageConverter"/>
         <bean class="org.springframework.http.converter.json.MappingJackson2HttpMessageConverter"/>
         <bean class="org.springframework.http.converter.xml.Jaxb2RootElementHttpMessageConverter"/>
         <bean class="org.springframework.http.converter.json.MappingJackson2HttpMessageConverter"/>
      </mvc:message-converters>

    </mvc:annotation-driven>

使用 register-defaults="false" 你告诉 Spring 不要使用任何默认转换器,而是使用下面提供的列表。在定义StringHttpMessageConverter时,我指定UTF-8(支持汉字)作为默认编码。

瞧瞧