2012-02-20 33 views
41

Tôi đã tạo một dịch vụ web còn lại nhỏ bằng Jersey 1.11. Khi tôi gọi url trả về Json, có vấn đề với mã hóa ký tự cho các ký tự không phải tiếng Anh. Url tương ứng cho Xml ("test.xml" làm cho nó utf-8 trong bắt đầu xml-tag.dịch vụ web jersey mã hóa json utf-8

Làm thế nào tôi có thể làm cho url "test.json" trở lại phản ứng utf-8 mã hóa?

Dưới đây là mã cho các dịch vụ:

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

Đây là POJO rằng dịch vụ sử dụng:

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

thể trùng lặp của [? Làm thế nào để thiết lập charset với JAX-RS] (http://stackoverflow.com/questions/3431996/how -to-set-the-charset-với-jax-rs) – rds

Trả lời

87

Jersey nên luôn luôn tạo ra utf-8 theo mặc định, có vẻ như vấn đề là khách hàng của bạn không phải là phiên dịch nó chính xác (khai báo xml không "làm" nó utf-8, chỉ cần nói cho khách hàng cách phân tích nó).

Bạn đang thấy những vấn đề này với khách hàng nào?

JSON hợp lệ chỉ được coi là Unicode (utf-8/16/32); các trình phân tích cú pháp sẽ có thể tự động phát hiện mã hóa (tất nhiên, một số không), vì vậy không có khai báo mã hóa trong JSON.

Bạn có thể thêm nó vào Content-Type như vậy:

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

Tôi đã gặp sự cố với cả trình duyệt Chrome và khách hàng còn lại từ google, nhưng đề xuất của bạn sẽ khắc phục được sự cố :) – Jojje

+1

Trong trường hợp của tôi, với áo 1,2 cũng khắc phục sự cố, cảm ơn –

+1

2015 và tôi vẫn gặp sự cố –

5

Nếu thêm charset cho mỗi và mọi tài nguyên không phải là một lựa chọn, có lẽ câu trả lời cho this question, trong đó cho thấy làm thế nào để thực thi một charset mặc định, có thể hữu ích.

3

responseMessage là lớp bean mà chúng tôi có thể gửi UTF-8 charset để phản hồi.

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

nếu @Produces (MediaType.APPLICATION_JSON + "; charset = utf-8") không hoạt động, sau đó thử:

@Produces ("application/json; charset = utf-8")

về mặt lý thuyết nó là như nhau, nhưng tùy chọn đầu tiên đã không làm việc với tôi

0

Bạn cũng có thể thử điều này:

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

Jersey là lỗi, khi ứng dụng Content-Type/json được sử dụng, nó không phát hiện mã hóa unicode JSON tự động như nó giả định, nhưng deserialize phần thân yêu cầu với bất kỳ mã hóa nền tảng thời gian chạy nào được sử dụng bởi máy chủ của bạn. Tương tự áp dụng cho việc serialization cơ thể phản ứng.

nhu cầu khách hàng của bạn để xác định một cách rõ ràng UTF-8 charset:

Content-Type: application/json;charset=utf-8 
Các vấn đề liên quan