您好,登錄后才能下訂單哦!
本篇內容主要講解“如何解決springboot整合cxf-jaxrs中json轉換的問題”,感興趣的朋友不妨來看看。本文介紹的方法操作簡單快捷,實用性強。下面就讓小編來帶大家學習“如何解決springboot整合cxf-jaxrs中json轉換的問題”吧!
我在將項目用boot重構時, 關于cxf的使用出了一些問題, 主要在實體類和json轉換這一方面。
在看了一些晚上的相關答案后, 了解到jaxb默認支持xml格式, 而實現對象轉json是需要額外的轉換器的,然后在stackoverflow上找到一個解決方法是聲明一個bean,注入JsonProvider,但我發現這個可以解決服務端將對象轉為json的問題,
而客戶端還是會報一個異常:
No message body reader has been found for class ......, ContentType: application/json
后面在cxf的WebClient類的源碼中發現:
create()方法有很多重載方法,其中有一個是可以指定provider來轉換格式,最后通過這個重載方法解決了客戶端json格式轉換問題。
在單獨使用cxf的基礎上做出改動,主要有兩方面
1. 服務端:在啟動類上聲明一個bean, 注入JacksonJaxbJsonProvider
2. 客戶端:在WebClient調用create()方法時,指定轉json的provider
下面是一個簡單的demo:
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-jpa</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <scope>test</scope> </dependency> <!--cxf-jaxrs-starter--> <dependency> <groupId>org.apache.cxf</groupId> <artifactId>cxf-spring-boot-starter-jaxrs</artifactId> <version>3.2.0</version> </dependency> <!--jaxrs轉json工具--> <dependency> <groupId>com.fasterxml.jackson.jaxrs</groupId> <artifactId>jackson-jaxrs-json-provider</artifactId> <version>2.8.5</version> </dependency>
配置cxf路徑和包掃描
server: port: 9001 cxf: path: /services servlet.init: service-list-path: /info jaxrs: component-scan: true
在啟動類中聲明一個bean,自動注入JacksonJaxbJsonProvider 對象,這樣cxf在將對象轉為json時會自動使用這個對象
@SpringBootApplication public class CxfServerApplication { public static void main(String[] args) { SpringApplication.run(CxfServerApplication.class, args); } // 配置一個對象與json轉換的工具 @Bean public JacksonJaxbJsonProvider jacksonJaxbJsonProvider() { return new JacksonJaxbJsonProvider(); } }
關于cxf的路徑注解,請參照其他cxf資料
@Path("/customerService") public interface CustomerService { /** * 客戶服務:根據id查詢客戶 */ @Path("/findById") @GET @Produces({"application/xml", "application/json"}) Customer findById(@QueryParam("id")Integer id); }
一個簡單的實現類, 不需要加額外注解, 注入dao從數據庫查詢數據返回(dao層代碼未貼出, 可自行實現)。
@Service @Transactional public class CustomerServiceImpl implements CustomerService { @Autowired private CustomerDao customerDao; @Override public Customer findById(Integer id) { // 調用dao, 從數據庫查詢客戶 return customerDao.findById(id); } }
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <!--cxf-jaxrs-starter--> <dependency> <groupId>org.apache.cxf</groupId> <artifactId>cxf-spring-boot-starter-jaxrs</artifactId> <version>3.2.0</version> </dependency> <!--jaxrs轉json工具--> <dependency> <groupId>com.fasterxml.jackson.jaxrs</groupId> <artifactId>jackson-jaxrs-json-provider</artifactId> <version>2.8.5</version> </dependency>
由于WebClient的create()方法需要的是List<Provider>形式的參數,所以創建一個繼承ArrayList類的JsonProvider,在構造方法中添加JacksonJaxbJsonProvider對象元素
@Component public class JsonProvider extends ArrayList<JacksonJaxbJsonProvider> { // 在構造方法中, 添加JacksonJaxbJsonProvider public JsonProvider(){ this.add(new JacksonJaxbJsonProvider()); } }
在Controller內注入上面創建的自定義的JsonProvider,并在WebClient調用create()方法時,作為方法參數注入,以此達到手動指定json轉換器的目的
@Controller public class CustomerController { // 注入配置的轉json工具 @Autowired private List<JacksonJaxbJsonProvider> jsonProvider; @RequestMapping("/customer_findById") @ResponseBody public List<Customer> findById(Integer id) { //調用webservice獲取查詢數據 Customer customer = WebClient .create("http://localhost:9001/services/customerService/findById?id="+id, jsonProvider) .accept(MediaType.APPLICATION_JSON).get(Customer.class); return customer; } }
@XmlRootElement(name = "xxx")
在3.2.1以后的版本需要手動配置ViewResolver
否則會報錯:
@ConditionalOnProperty(spring.mvc.locale) did not find property 'locale' (OnPropertyCondition)
到此,相信大家對“如何解決springboot整合cxf-jaxrs中json轉換的問題”有了更深的了解,不妨來實際操作一番吧!這里是億速云網站,更多相關內容可以進入相關頻道進行查詢,關注我們,繼續學習!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。