返回顶部
首页 > 资讯 > 后端开发 > Python >解决springboot整合cxf-jaxrs中json转换的问题
  • 459
分享到

解决springboot整合cxf-jaxrs中json转换的问题

2024-04-02 19:04:59 459人浏览 八月长安

Python 官方文档:入门教程 => 点击学习

摘要

前言 我在将项目用boot重构时, 关于cxf的使用出了一些问题, 主要在实体类和JSON转换这一方面。 在看了一些晚上的相关答案后, 了解到jaxb默认支持xml格式, 而实现对象

前言

我在将项目用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:

一、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 { 
    
    @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)

以上为个人经验,希望能给大家一个参考,也希望大家多多支持编程网。

--结束END--

本文标题: 解决springboot整合cxf-jaxrs中json转换的问题

本文链接: https://lsjlt.com/news/130155.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • 解决springboot整合cxf-jaxrs中json转换的问题
    前言 我在将项目用boot重构时, 关于cxf的使用出了一些问题, 主要在实体类和json转换这一方面。 在看了一些晚上的相关答案后, 了解到jaxb默认支持xml格式, 而实现对象...
    99+
    2024-04-02
  • 如何解决springboot整合cxf-jaxrs中json转换的问题
    本篇内容主要讲解“如何解决springboot整合cxf-jaxrs中json转换的问题”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“如何解决springboot整合cxf-jaxrs中json...
    99+
    2023-06-20
  • 解决springboot整合cxf启动报错,原因是版本问题
    springboot整合cxf启动报错 错误信息如下 [DEBUG] 2021-01-26 11:28:47,848 [main] org.springframework.boo...
    99+
    2024-04-02
  • JSON各种转换问题怎么解决
    这篇文章主要讲解了“JSON各种转换问题怎么解决”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“JSON各种转换问题怎么解决”吧!首先引入jar包:<dependency>&nbs...
    99+
    2023-07-05
  • SpringBoot整合Lombok及常见问题解决
    目录Lombok2. Lombok注解失效原因整合过程1. 引入Lombok依赖:2. 安装Lombok插件优点与缺点(可能出现的问题即解决方法)Lombok Lombok能以简单的...
    99+
    2024-04-02
  • 解决SpringBoot整合ElasticSearch遇到的连接问题
    SpringBoot整合ElasticSearch的连接问题 failed to load elasticsearch nodes : org.elasticsearch.clie...
    99+
    2024-04-02
  • 如何解决SpringBoot整合thymeleaf报错的问题
    这篇文章主要讲解了“如何解决SpringBoot整合thymeleaf报错的问题”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“如何解决SpringBoot整合thymeleaf报错的问题”吧...
    99+
    2023-06-20
  • 如何解决SpringBoot整合RocketMQ遇到的问题
    本篇内容主要讲解“如何解决SpringBoot整合RocketMQ遇到的问题”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“如何解决SpringBoot整合RocketMQ遇到的问题”吧!应用场景...
    99+
    2023-06-20
  • 聊聊springboot中整合log4g2的问题
    1.导入jar springboot默认是用logback的日志框架的,所以需要排除logback,不然会出现jar依赖冲突的报错。 <dependency> ...
    99+
    2024-04-02
  • SpringBoot整合Mybatis,解决TypeAliases配置失败的问题
    问题描述 在应用MyBatis时,使用对象关系映射,将对象和Aliase映射起来。 在Mybatis的文档明确写出,如果你没有明确定义实体类的Aliase,框架会自动将Class N...
    99+
    2024-04-02
  • 关于springboot整合swagger问题及解决方法
    目录一.前言二.整合jsp1.pom引入2.配置文件application.properties3.前端代码目录4.运行效果 三.整合swagger1.pom引入2.swa...
    99+
    2024-04-02
  • SpringBoot整合Lombok及常见问题怎么解决
    这篇文章主要介绍“SpringBoot整合Lombok及常见问题怎么解决”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“SpringBoot整合Lombok及常见问题怎么解决”文章能帮助大家解决问题。...
    99+
    2023-06-30
  • 怎么解决springBoot整合Eureka启动失败的问题
    这篇文章主要介绍“怎么解决springBoot整合Eureka启动失败的问题”,在日常操作中,相信很多人在怎么解决springBoot整合Eureka启动失败的问题问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答...
    99+
    2023-06-20
  • SpringBoot整合Mybatis,解决TypeAliases配置失败的问题如何解决
    本篇内容主要讲解“SpringBoot整合Mybatis,解决TypeAliases配置失败的问题如何解决”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“SpringBoot整合Mybatis,解...
    99+
    2023-06-20
  • SpringBoot整合JWT框架,解决Token跨域验证问题
    目录一、传统Session认证  1、认证过程2、存在问题二、JWT简介  1、认证流程2、JWT结构说明 3、JWT使用方式 三、与SpringBoot2整合&...
    99+
    2024-04-02
  • SpringBoot怎么解决Long型数据转换成json格式时丢失精度问题
    这篇“SpringBoot怎么解决Long型数据转换成json格式时丢失精度问题”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇...
    99+
    2023-07-02
  • SpringBoot整合kafka遇到的版本不对应问题及解决
    目录SpringBoot整合kafka遇到版本不对应如果你的SpringBoot是2.0.3版本如果你的SpringBoot比较新,用的2.1.0版本SpringBoot整合kafk...
    99+
    2024-04-02
  • SpringBoot详解整合MyBatis过程中可能遇到的问题
    尽量不要用 jUnit 提供的单元测试 提一个要求尽量使用SpringBoot 提供的测试类进行测试,能够自动扫描组件以及使用容器中的bean对象 还有如果有组件 中存在注入对象的话...
    99+
    2024-04-02
  • springBoot中shiro的302跳转问题怎么解决
    本篇内容介绍了“springBoot中shiro的302跳转问题怎么解决”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!springBoot前...
    99+
    2023-06-22
  • 怎么解决Struts Hibernate的整合问题
    这篇文章主要介绍“怎么解决Struts Hibernate的整合问题”,在日常操作中,相信很多人在怎么解决Struts Hibernate的整合问题问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”怎么解决Str...
    99+
    2023-06-17
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作