Jersey 1.11を使用して小さなRest Webサービスを作成しました。 Jsonを返すURLを呼び出すと、英語以外の文字の文字エンコードに問題があります。 Xmlの対応するURL( "test.xml"は、開始xml-tagでutf-8にします。
URL "test.json"がutf-8エンコードされた応答を返すようにするにはどうすればよいですか?
サービスのコードは次のとおりです。
@Stateless
@Path("/")
public class RestTest {
@EJB
private MyDao myDao;
@Path("test.xml/")
@GET
@Produces(MediaType.APPLICATION_XML )
public List<Profile> getProfiles() {
return myDao.getProfilesForWeb();
}
@Path("test.json/")
@GET
@Produces(MediaType.APPLICATION_JSON)
public List<Profile> getProfilesAsJson() {
return myDao.getProfilesForWeb();
}
}
これはサービスが使用するpojoです:
package se.kc.mimee.profile.model;
@XmlRootElement
public class Profile {
public int id;
public String name;
public Profile(int id, String name) {
this.id = id;
this.name = name;
}
public Profile() {}
}
Jerseyは常にデフォルトでutf-8を生成する必要があります。問題は、クライアントが正しく解釈していないように聞こえます(xml宣言はutf-8を「作成」せず、クライアントに解析方法を指示するだけです)。
これらの問題をどのクライアントで見ていますか?
有効なJSONはUnicode(utf-8/16/32)のみであると想定されています。パーサーはエンコードを自動的に検出できる必要があります(もちろん、そうでないものもあります)。そのため、JSONにはエンコード宣言はありません。
次のようにContent-Type
に追加できます:
@Produces(MediaType.APPLICATION_JSON + ";charset=utf-8")
すべてのリソースに文字セットを追加することがオプションではない場合、デフォルトの文字セットを適用する方法を示す この質問 に対する回答が役立つ場合があります。
responseMessage
は、UTF-8 charset
に応じて。
return Response.ok(responseMessage).header("Content-Type", "application/json;charset=UTF-8").build();
@Produces(MediaType.APPLICATION_JSON + "; charset = utf-8")が機能しない場合は、次を試してください。
@Produces( "application/json; charset = utf-8")
理論的には同じですが、最初のオプションは私にはうまくいきませんでした
これを試すこともできます:
return Response.ok(responseMessage, "application/json;charset=UTF-8").build();
Jerseyはバグが多いため、Content-Type application/jsonを使用すると、想定どおりにユニコードJSONエンコードを自動的に検出しませんが、サーバーで使用されるランタイムプラットフォームエンコードでリクエスト本体をデシリアライズします。応答本体のシリアル化にも同じことが当てはまります。
クライアントは、UTF-8文字セットを明示的に指定する必要があります。
Content-Type: application/json;charset=utf-8