最近在使用cxf做項目開發(fā),遇到了一個問題,就是在使用json作為參數(shù)向服務(wù)端發(fā)送請求時,如果請求中包含中文字符,轉(zhuǎn)換后得到的對象中會出現(xiàn)亂碼。這讓我非常困惑,于是決定認(rèn)真研究一下這個問題。
經(jīng)過分析,我發(fā)現(xiàn)問題出現(xiàn)在cxf默認(rèn)使用jettison進(jìn)行json的轉(zhuǎn)換。而jettison對于中文字符會采用unicode編碼方式,這就導(dǎo)致了中文字符在轉(zhuǎn)換后出現(xiàn)的亂碼。下面是一個代碼示例:
public class Person { private String name; private int age; //getter、setter方法 } @POST @Path("/savePerson") @Consumes(MediaType.APPLICATION_JSON) public void savePerson(Person person) { System.out.println(person.getName()); //一些保存操作 }
我們使用Postman工具將json參數(shù)作為請求體發(fā)送:
{ "name": "張三", "age": 20 }
在調(diào)用savePerson方法時,輸出的person對象中name屬性值出現(xiàn)了亂碼。這是因為jettison默認(rèn)采用"strict-json"模式,即所有字符串進(jìn)行unicode編碼,所以一些特殊字符就無法正確顯示了。
解決這個問題的方法很簡單,就是在cxf服務(wù)設(shè)置中更換json提供者。比如我們可以使用JacksonJsonProvider:
jaxrs:providersjaxrs:providers
使用JacksonJsonProvider可以很好地解決中文亂碼的問題,并且還提供了更多的自定義配置。這個問題就這樣解決了,希望能對大家有所幫助。