欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

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

 更新時(shí)間:2021年07月09日 11:25:29   作者:未完成交響曲-KyleWang  
這篇文章主要介紹了解決springboot整合cxf-jaxrs中json轉(zhuǎn)換的問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教

前言

我在將項(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)題,

而客戶端還是會(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è)重載方法解決了客戶端json格式轉(zhuǎn)換問(wèn)題。

最后的解決方案:

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

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

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

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

一、webservice服務(wù)端(生產(chǎn)者)

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轉(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: 9001
cxf:
  path: /services
  servlet.init:
    service-list-path: /info
  jaxrs:
    component-scan: true

3.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ì)象

@SpringBootApplication
public class CxfServerApplication { 
	public static void main(String[] args) {
		SpringApplication.run(CxfServerApplication.class, args);
	}
 
	// 配置一個(gè)對(duì)象與json轉(zhuǎn)換的工具
	@Bean
	public JacksonJaxbJsonProvider jacksonJaxbJsonProvider() {
		return new JacksonJaxbJsonProvider();
	}
}

4.客戶服務(wù)接口

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

@Path("/customerService")
public interface CustomerService { 
    /**
     * 客戶服務(wù):根據(jù)id查詢客戶
     */
    @Path("/findById")
    @GET
    @Produces({"application/xml", "application/json"})
    Customer findById(@QueryParam("id")Integer id);
}

5.客戶服務(wù)實(shí)現(xiàn)類(lèi)

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

@Service
@Transactional
public class CustomerServiceImpl implements CustomerService { 
    @Autowired
    private CustomerDao customerDao; 
    @Override
    public Customer findById(Integer id) {
        // 調(diào)用dao, 從數(shù)據(jù)庫(kù)查詢客戶
        return customerDao.findById(id);
    }
}

二、webservice客戶端(消費(fèi)者)

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轉(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ì)象元素

@Component
public 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)換器的目的

@Controller
public class CustomerController { 
    // 注入配置的轉(zhuǎn)json工具
    @Autowired
    private List<JacksonJaxbJsonProvider> jsonProvider; 
    @RequestMapping("/customer_findById")
    @ResponseBody
    public List<Customer> findById(Integer id) {
        //調(diào)用webservice獲取查詢數(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è)參考,也希望大家多多支持腳本之家。

相關(guān)文章

  • 自己寫(xiě)的簡(jiǎn)易版Java日志類(lèi)分享

    自己寫(xiě)的簡(jiǎn)易版Java日志類(lèi)分享

    這篇文章主要介紹了自己寫(xiě)的簡(jiǎn)易版Java日志類(lèi)分享,本文直接給出實(shí)現(xiàn)代碼,需要的朋友可以參考下
    2015-06-06
  • Java兩種常用的隨機(jī)數(shù)生成方式(小白總結(jié))

    Java兩種常用的隨機(jī)數(shù)生成方式(小白總結(jié))

    這篇文章主要介紹了Java兩種常用的隨機(jī)數(shù)生成方式(小白總結(jié)),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2020-10-10
  • springboot設(shè)置加載靜態(tài)資源的路徑(spring.resources.static-locations)

    springboot設(shè)置加載靜態(tài)資源的路徑(spring.resources.static-locations)

    這篇文章主要介紹了springboot設(shè)置加載靜態(tài)資源的路徑方式(spring.resources.static-locations),具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-08-08
  • Java常用工具類(lèi)匯總 附示例代碼

    Java常用工具類(lèi)匯總 附示例代碼

    這篇文章主要介紹了Java常用工具類(lèi)匯總 附示例代碼,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2021-04-04
  • 深入了解Java中成員變量與局部變量的使用與區(qū)別

    深入了解Java中成員變量與局部變量的使用與區(qū)別

    成員變量和局部變量在每種編程語(yǔ)言中都有涉及,本文將通過(guò)示例為大家詳細(xì)講講Java中成員變量與局部變量的使用與區(qū)別,感興趣的可以了解一下
    2022-08-08
  • 使用HTTPclient保持長(zhǎng)連接

    使用HTTPclient保持長(zhǎng)連接

    這篇文章主要介紹了使用HTTPclient保持長(zhǎng)連接,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-10-10
  • java異常處理throws完成異常拋出詳解

    java異常處理throws完成異常拋出詳解

    這篇文章主要介紹了java異常處理中throws完成異常拋出示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家學(xué)有所得多多進(jìn)步
    2021-10-10
  • MapStruct實(shí)體轉(zhuǎn)換及List轉(zhuǎn)換的方法講解

    MapStruct實(shí)體轉(zhuǎn)換及List轉(zhuǎn)換的方法講解

    今天小編就為大家分享一篇關(guān)于MapStruct實(shí)體轉(zhuǎn)換及List轉(zhuǎn)換的方法講解,小編覺(jué)得內(nèi)容挺不錯(cuò)的,現(xiàn)在分享給大家,具有很好的參考價(jià)值,需要的朋友一起跟隨小編來(lái)看看吧
    2019-03-03
  • Java 集合框架之List 的使用(附小游戲練習(xí))

    Java 集合框架之List 的使用(附小游戲練習(xí))

    這篇文章主要介紹Java 集合框架中List 的使用,下面文章將圍繞Java 集合框架中List 的使用展開(kāi)話題,并附上一些小游戲練習(xí),需要的朋友可以參考一下
    2021-10-10
  • SpringBoot整合ES高級(jí)查詢方式

    SpringBoot整合ES高級(jí)查詢方式

    這篇文章主要介紹了SpringBoot整合ES高級(jí)查詢方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-05-05

最新評(píng)論