久久r热视频,国产午夜精品一区二区三区视频,亚洲精品自拍偷拍,欧美日韩精品二区

您的位置:首頁(yè)技術(shù)文章
文章詳情頁(yè)

解決springboot整合cxf-jaxrs中json轉(zhuǎn)換的問(wèn)題

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

我在將項(xiàng)目用boot重構(gòu)時(shí), 關(guān)于cxf的使用出了一些問(wèn)題, 主要在實(shí)體類(lèi)和json轉(zhuǎn)換這一方面。

在看了一些晚上的相關(guān)答案后, 了解到j(luò)axb默認(rèn)支持xml格式, 而實(shí)現(xiàn)對(duì)象轉(zhuǎn)json是需要額外的轉(zhuǎn)換器的,然后在stackoverflow上找到一個(gè)解決方法是聲明一個(gè)bean,注入JsonProvider,但我發(fā)現(xiàn)這個(gè)可以解決服務(wù)端將對(duì)象轉(zhuǎn)為json的問(wèn)題,

而客戶(hù)端還是會(huì)報(bào)一個(gè)異常:

No message body reader has been found for class ......, ContentType: application/json

后面在cxf的WebClient類(lèi)的源碼中發(fā)現(xiàn):

create()方法有很多重載方法,其中有一個(gè)是可以指定provider來(lái)轉(zhuǎn)換格式,最后通過(guò)這個(gè)重載方法解決了客戶(hù)端json格式轉(zhuǎn)換問(wèn)題。

解決springboot整合cxf-jaxrs中json轉(zhuǎn)換的問(wèn)題

最后的解決方案:

在單獨(dú)使用cxf的基礎(chǔ)上做出改動(dòng),主要有兩方面

1. 服務(wù)端:在啟動(dòng)類(lèi)上聲明一個(gè)bean, 注入JacksonJaxbJsonProvider

2. 客戶(hù)端:在WebClient調(diào)用create()方法時(shí),指定轉(zhuǎn)json的provider

下面是一個(gè)簡(jiǎn)單的demo:

一、webservice服務(wù)端(生產(chǎn)者)1.maven依賴(lài)

<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轉(zhuǎn)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應(yīng)用啟動(dòng)類(lèi)配置

在啟動(dòng)類(lèi)中聲明一個(gè)bean,自動(dòng)注入JacksonJaxbJsonProvider 對(duì)象,這樣cxf在將對(duì)象轉(zhuǎn)為json時(shí)會(huì)自動(dòng)使用這個(gè)對(duì)象

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

關(guān)于cxf的路徑注解,請(qǐng)參照其他cxf資料

@Path('/customerService')public interface CustomerService { /** * 客戶(hù)服務(wù):根據(jù)id查詢(xún)客戶(hù) */ @Path('/findById') @GET @Produces({'application/xml', 'application/json'}) Customer findById(@QueryParam('id')Integer id);}5.客戶(hù)服務(wù)實(shí)現(xiàn)類(lèi)

一個(gè)簡(jiǎn)單的實(shí)現(xiàn)類(lèi), 不需要加額外注解, 注入dao從數(shù)據(jù)庫(kù)查詢(xún)數(shù)據(jù)返回(dao層代碼未貼出, 可自行實(shí)現(xiàn))。

@Service@Transactionalpublic class CustomerServiceImpl implements CustomerService { @Autowired private CustomerDao customerDao; @Override public Customer findById(Integer id) {// 調(diào)用dao, 從數(shù)據(jù)庫(kù)查詢(xún)客戶(hù)return customerDao.findById(id); }}二、webservice客戶(hù)端(消費(fèi)者)1.maven依賴(lài)

<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轉(zhuǎn)json工具--><dependency><groupId>com.fasterxml.jackson.jaxrs</groupId><artifactId>jackson-jaxrs-json-provider</artifactId><version>2.8.5</version></dependency>2.配置轉(zhuǎn)json工具

由于WebClient的create()方法需要的是List<Provider>形式的參數(shù),所以創(chuàng)建一個(gè)繼承ArrayList類(lèi)的JsonProvider,在構(gòu)造方法中添加JacksonJaxbJsonProvider對(duì)象元素

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

在Controller內(nèi)注入上面創(chuàng)建的自定義的JsonProvider,并在WebClient調(diào)用create()方法時(shí),作為方法參數(shù)注入,以此達(dá)到手動(dòng)指定json轉(zhuǎn)換器的目的

@Controllerpublic class CustomerController { // 注入配置的轉(zhuǎn)json工具 @Autowired private List<JacksonJaxbJsonProvider> jsonProvider; @RequestMapping('/customer_findById') @ResponseBody public List<Customer> findById(Integer id) {//調(diào)用webservice獲取查詢(xún)數(shù)據(jù)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格式轉(zhuǎn)換后傳輸?shù)膶?shí)體類(lèi)要在類(lèi)名上加一個(gè)注解

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

在3.2.1以后的版本需要手動(dòng)配置ViewResolver

否則會(huì)報(bào)錯(cuò):

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

以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持好吧啦網(wǎng)。

標(biāo)簽: Spring
相關(guān)文章:
主站蜘蛛池模板: 临洮县| 古浪县| 台安县| 新沂市| 汉源县| 达拉特旗| 新安县| 济阳县| 大方县| 大冶市| 建宁县| 邯郸县| 刚察县| 淮滨县| 普陀区| 玉田县| 通许县| 独山县| 宁夏| 雷州市| 兴海县| 天祝| 盘锦市| 大田县| 长葛市| 乐业县| 贞丰县| 陇南市| 镇康县| 泸州市| 永仁县| 临武县| 汶上县| 丰都县| 类乌齐县| 喜德县| 洪江市| 扶沟县| 岳普湖县| 左云县| 汉源县|