国产成人精品久久免费动漫-国产成人精品天堂-国产成人精品区在线观看-国产成人精品日本-a级毛片无码免费真人-a级毛片毛片免费观看久潮喷

您的位置:首頁技術文章
文章詳情頁

解決springboot整合cxf-jaxrs中json轉換的問題

瀏覽:7日期:2023-02-26 11:45:26
前言

我在將項目用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格式轉換問題。

解決springboot整合cxf-jaxrs中json轉換的問題

最后的解決方案:

在單獨使用cxf的基礎上做出改動,主要有兩方面

1. 服務端:在啟動類上聲明一個bean, 注入JacksonJaxbJsonProvider

2. 客戶端:在WebClient調用create()方法時,指定轉json的provider

下面是一個簡單的demo:

一、webservice服務端(生產者)1.maven依賴

<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>2.application.yml配置文件

配置cxf路徑和包掃描

server: port: 9001cxf: path: /services servlet.init: service-list-path: /info jaxrs: component-scan: true3.boot應用啟動類配置

在啟動類中聲明一個bean,自動注入JacksonJaxbJsonProvider 對象,這樣cxf在將對象轉為json時會自動使用這個對象

@SpringBootApplicationpublic class CxfServerApplication { public static void main(String[] args) {SpringApplication.run(CxfServerApplication.class, args);} // 配置一個對象與json轉換的工具@Beanpublic JacksonJaxbJsonProvider jacksonJaxbJsonProvider() {return new JacksonJaxbJsonProvider();}}4.客戶服務接口

關于cxf的路徑注解,請參照其他cxf資料

@Path('/customerService')public interface CustomerService { /** * 客戶服務:根據id查詢客戶 */ @Path('/findById') @GET @Produces({'application/xml', 'application/json'}) Customer findById(@QueryParam('id')Integer id);}5.客戶服務實現類

一個簡單的實現類, 不需要加額外注解, 注入dao從數據庫查詢數據返回(dao層代碼未貼出, 可自行實現)。

@Service@Transactionalpublic class CustomerServiceImpl implements CustomerService { @Autowired private CustomerDao customerDao; @Override public Customer findById(Integer id) {// 調用dao, 從數據庫查詢客戶return customerDao.findById(id); }}二、webservice客戶端(消費者)1.maven依賴

<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>2.配置轉json工具

由于WebClient的create()方法需要的是List<Provider>形式的參數,所以創建一個繼承ArrayList類的JsonProvider,在構造方法中添加JacksonJaxbJsonProvider對象元素

@Componentpublic class JsonProvider extends ArrayList<JacksonJaxbJsonProvider> {// 在構造方法中, 添加JacksonJaxbJsonProvider public JsonProvider(){this.add(new JacksonJaxbJsonProvider()); }}3.使用WebClient調用webservice服務

在Controller內注入上面創建的自定義的JsonProvider,并在WebClient調用create()方法時,作為方法參數注入,以此達到手動指定json轉換器的目的

@Controllerpublic 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; }}三、其他注意1.需要用xml/json格式轉換后傳輸的實體類要在類名上加一個注解

@XmlRootElement(name = 'xxx')2.上面demo使用的cxf-spring-boot-starter-jaxrs版本為3.2.0

在3.2.1以后的版本需要手動配置ViewResolver

否則會報錯:

@ConditionalOnProperty(spring.mvc.locale) did not find property ’locale’ (OnPropertyCondition)

以上為個人經驗,希望能給大家一個參考,也希望大家多多支持好吧啦網。

標簽: Spring
相關文章:
主站蜘蛛池模板: 久久亚洲精品中文字幕亚瑟 | 97视频在线观看免费 | 亚洲综合久久久久久中文字幕 | 久久成人在线 | 美女脱了内裤张开腿让男人桶网站 | 亚洲夜 | s8国产成人精品视频 | 在线看一级片 | 99久久视频| 欧美高清在线精品一区二区不卡 | 一级做a爰片久久毛片看看 一级做a爰片久久毛片鸭王 | 她也啪97在线视频 | 欧美一级成人影院免费的 | 久草在线视频在线观看 | 国内一级野外a一级毛片 | 一个人看的www片免费视频中文 | 97精品国产91久久久久久久 | 日本精品一区二区三区在线视频一 | 亚洲理论片在线观看 | 久久91亚洲精品中文字幕奶水 | 精品国产不卡一区二区三区 | 337p粉嫩日本亚洲大胆艺术照 | 男人天堂网在线视频 | 能在线观看的一区二区三区 | 久草免费网站 | 精品国产免费一区二区三区 | 日韩中文字幕网 | 久久久久久久岛国免费观看 | 国产精品自在线天天看片 | 国产a一级毛片含羞草传媒 国产a自拍 | 99精品视频在线观看re | 日韩欧美色综合 | 国产一久久香蕉国产线看观看 | 免费一级a毛片在线播放视 免费一级α片在线观看 | 国产成人免费全部网站 | 亚洲国产日产韩国欧美综合 | 午夜国产视频 | 成年人视频在线观看免费 | 很黄的网站在线观看 | 成年18网站免费视频网站 | 国产欧美一区二区 |