最近在使用cxf轉json的過程中,發(fā)現一些數據類型會丟失。具體表現為,某些數據的類型在轉換成json格式后變成了字符串類型,而不是原本的數字或布爾類型。
經過查閱cxf文檔和相關資料,發(fā)現這是因為cxf默認使用了JacksonJsonProvider來進行json轉換,而JacksonJsonProvider在轉換數字和布爾類型時,會將其轉換成字符串類型。
//使用cxf默認的JacksonJsonProvider
JAXRSClientFactoryBean jaxrsFactory = new JAXRSClientFactoryBean();
jaxrsFactory.setServiceClass(SomeService.class);
jaxrsFactory.setAddress("http://localhost:8080/service");
SomeService service = jaxrsFactory.create(SomeService.class);
解決這個問題的方法有兩種,一種是在代碼中使用不同的json提供器,另一種是對JacksonJsonProvider進行配置。
第一種方法,我們可以手動創(chuàng)建不同的json提供器來替代cxf默認的JacksonJsonProvider。比如,我們可以使用JettisonJsonProvider來處理json格式:
//使用JettisonJsonProvider
JAXRSClientFactoryBean jaxrsFactory = new JAXRSClientFactoryBean();
jaxrsFactory.setServiceClass(SomeService.class);
jaxrsFactory.setAddress("http://localhost:8080/service");
jaxrsFactory.setProvider(new JettisonJsonProvider());
SomeService service = jaxrsFactory.create(SomeService.class);
第二種方法,我們可以對JacksonJsonProvider進行配置,使其在處理數字和布爾類型時不會將其轉換成字符串類型。具體配置如下:
//配置JacksonJsonProvider
JAXRSClientFactoryBean jaxrsFactory = new JAXRSClientFactoryBean();
jaxrsFactory.setServiceClass(SomeService.class);
jaxrsFactory.setAddress("http://localhost:8080/service");
JacksonJsonProvider jsonProvider = new JacksonJsonProvider();
jsonProvider.configure(SerializationConfig.Feature.WRITE_NUMBERS_AS_STRINGS, false);
jsonProvider.configure(SerializationConfig.Feature.WRITE_BOOLEANS_AS_STRINGS, false);
jaxrsFactory.setProvider(jsonProvider);
SomeService service = jaxrsFactory.create(SomeService.class);
以上兩種方法都可以解決cxf轉json丟失數據類型的問題,具體選擇哪種方法,需要根據具體情況進行選擇。