1

http応答の文字エンコードに問題があります。ヒントやチュートリアルなどをたくさん読みましたが、問題を解決できません。ビューテクノロジーとして、HibernateとExtJSを備えたSpringMVCを使用しています。すべてのデータは、コントローラーメソッドで@ResponseBodyを使用してJSONとして返されます。方法の例:

@RequestMapping(method = RequestMethod.POST, value = "dispatcher")
@ResponseBody
public String dispatcherPost(HttpServletRequest req, HttpServletResponse resp, HttpSession session) {
    return process(req, resp, session);
}

URLコマンドをディスパッチするための単純なディスパッチメカニズムがあります(この場合はそれほど重要ではありません)。プロセスメソッドはパラメーターを使用して何かを実行し、JSONを返します。このJSONには、たとえばデータベース(PostgreSQL 9.1.4)のデータが含まれています。PostgresのデータはUTF-8に保存され、たとえばpgAdminで「正しく表示」されます。Eclipseでのデバッグ中に、(データベースからの)有効なデータを確認することもできます。Postgresからデータを取得しても問題はないようです。@ResponseBody注釈付きメソッドを介してそれらを返したいときに問題が始まります。メソッド「process」は、utf-8文字を含む有効な文字列(デバッグモードで表示できます)を返しますが、Webブラウザー(chrome、firefox)には「?」があります。データベースに保存されているポーランド語の代わりに。ファイアバグを調べると、応答ヘッダーが部分的に有効であることがわかります。'Content-type:text / html; charset=UTF-8'。プロセスメソッドに次のコード行があるため、「部分的に」と言いました。

`resp.setContentType(" application / json; charset = UTF-8 ");`

ここで、respはHttpServletResponseです。このソリューションからSpringsBeanポストプロセッサを追加しようとしました:http://stackoverflow.com/questions/3616359/who-sets-response-content-type-in​​-spring-mvc-responsebody/3617594#3617594しかし、そうではありません。 tは動作します。web.xmlには文字エンコードフィルターもあります

<!-- Force Char Encoding -->
<filter>
    <filter-name>encodingFilter</filter-name>
    <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
    <init-param>
        <param-name>encoding</param-name>
        <param-value>UTF-8</param-value>
    </init-param>
    <init-param>
        <param-name>forceEncoding</param-name>
        <param-value>true</param-value>
    </init-param>
</filter>

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

したがって、基本的に問題は、サーバーから適切にエンコードされたJSONを返すことです。何か案が?

編集:

proccessメソッドにコードを貼り付けます。

System.err.println( "TEST" + System.getProperty( "file.encoding"));
System.err.println( "TEST normal:" + response);
System.err.println( "TEST cp1250:" + new String(response.getBytes()、 "cp1250"));
System.err.println( "TEST UTF-8:" + new String(response.getBytes()、 "UTF-8"));

結果は次のようになります。

TEST Cp1250
TEST normal:{"users":[{"login":"userąęśćółżń"}]}
TEST cp1250:{"users":[{"login":"userąęśćółżń"}]}
TEST UTF-8:{"users ":[{" login ":" user ????? "}]}

ありがとう、アレック

4

1 に答える 1

2

わかりました。http: //static.springsource.org/spring/docs/3.0.x/reference/remoting.html#rest-message-conversionとSpringshttpメッセージコンバーターを使用している@ResponseBodyアノテーションでは奇妙なようです。カスタムメッセージコンバーターの作成に取り掛かる時間がないので、解決策は@ResponseBodyアノテーションを削除し、次のようなものを使用することです。

@RequestMapping(method = RequestMethod.GET, value = "dispatcher")
public void dispatcherGet(HttpServletRequest req, HttpServletResponse resp, HttpSession session) {
    String response =  process(req, resp, session);
    try {
        resp.getWriter().write(response);
        resp.getWriter().flush();
    } catch (IOException e) {
        e.printStackTrace();
    }
}

多分これは誰かを助けるでしょう。ありがとう、アレック

于 2012-07-23T11:10:15.717 に答える