2012-02-20 7 views
41

Zrobiłem mały serwis internetowy Rest za pomocą Jersey 1.11. Kiedy zadzwonię do adresu URL, który zwraca Json, pojawiają się problemy z kodowaniem znaków dla znaków spoza angielskiego. Odpowiedni adres URL XML ("test.xml" sprawia, że ​​UTF-8 w wyjściowym xml-tag.serwis internetowy jersey json utf-8 kodowanie

Jak mogę dokonać url "test.json" powrót kodowanie UTF-8 odpowiedzi?

Oto kod dla usługi:

@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(); 
    } 
} 

to pojo że usługa używa:

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() {} 

} 
+0

możliwe duplikat [? Jak ustawić charset z JAX-RS] (http://stackoverflow.com/questions/3431996/how -to-set-the-charset-z-jax-rs) – rds

Odpowiedz

87

Jersey zawsze powinien produkować UTF-8 domyślnie brzmi jak problem jest to, że klient nie jest tłumaczenie to poprawnie (deklaracja xml nie "robi" go utf-8, tylko informuje klienta, jak go parsować).

Z jakim klientem widzisz te problemy?

Prawidłowy JSON ma mieć tylko Unicode (utf-8/16/32); parsery powinny być w stanie wykryć kodowanie automatycznie (oczywiście niektóre nie), więc nie ma deklaracji kodowania w JSON.

Można dodać go do Content-Type tak:

@Produces(MediaType.APPLICATION_JSON + ";charset=utf-8") 
+2

Widziałem problem z moją przeglądarką Chrome i klientem odpoczynku z google, ale twoja sugestia rozwiązuje problem :) – Jojje

+1

W moim przypadku, z jersey 1.2 również Rozwiązuje problem, dzięki –

+1

2015 i nadal mam problem –

5

Jeśli dodanie charset do każdego zasobu nie jest opcją, może odpowiedź na this question, który pokazuje w jaki sposób wymusić domyślny zestaw znaków, może być pomocne.

3

responseMessage to klasa fasoli, w której możemy wysłać UTF-8 charset w odpowiedzi.

return Response.ok(responseMessage).header("Content-Type", "application/json;charset=UTF-8").build(); 
3

jeśli @Produces (MediaType.APPLICATION_JSON + "; Charset = UTF-8") nie działa, a następnie spróbuj:

@Produces ("application/json; Charset = UTF-8"),

w teorii jest to samo, ale pierwsza opcja nie działa mi

0

Możesz też spróbować:

return Response.ok(responseMessage, "application/json;charset=UTF-8").build(); 
0

Jersey jest błędny, gdy aplikacja Content-Type/json jest używana, nie wykrywa automatycznie kodowania JSON w Unicode, jak przypuszczalnie, ale przekształca deserializację treści żądania za pomocą dowolnego kodowania platformy wykonawczej używanego przez serwer. To samo dotyczy serializacji treści odpowiedzi.

Twoje potrzeby klienta, aby wyraźnie określić UTF-8 charset:

Content-Type: application/json;charset=utf-8