亚洲激情专区-91九色丨porny丨老师-久久久久久久女国产乱让韩-国产精品午夜小视频观看

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

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

發布時間:2021-07-09 13:38:38 來源:億速云 閱讀:405 作者:chen 欄目:開發技術

本篇內容主要講解“如何解決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格式轉換問題。

如何解決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: 9001
cxf:
  path: /services
  servlet.init:
    service-list-path: /info
  jaxrs:
    component-scan: true
3.boot應用啟動類配置

在啟動類中聲明一個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();
	}
}
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
@Transactional
public 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對象元素

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

在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;
    }
}

三、其他注意

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)

到此,相信大家對“如何解決springboot整合cxf-jaxrs中json轉換的問題”有了更深的了解,不妨來實際操作一番吧!這里是億速云網站,更多相關內容可以進入相關頻道進行查詢,關注我們,繼續學習!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

榆林市| 临汾市| 平邑县| 榕江县| 安塞县| 东明县| 黑河市| 冀州市| 长武县| 梅河口市| 寻甸| 万年县| 八宿县| 化德县| 嵩明县| 鄂温| 宝应县| 尼木县| 通化市| 虞城县| 柳江县| 青海省| 乳源| 霸州市| 读书| 镇沅| 屯门区| 华亭县| 永登县| 门头沟区| 应用必备| 温泉县| 临桂县| 青浦区| 安康市| 麻城市| 徐水县| 云阳县| 集安市| 梁平县| 临夏市|