返回顶部
首页 > 资讯 > 后端开发 > Python >Spring Boot中如何使用Convert接口实现类型转换器
  • 968
分享到

Spring Boot中如何使用Convert接口实现类型转换器

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

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

摘要

目录使用Convert接口实现类型转换器Converter接口添加依赖实体类1.User类2.Article类配置类型转化器1.定义全局日期转换器2.定义全局对象转换器3.定义全局L

使用Convert接口实现类型转换器

spring3中引入了一个Converter接口,它支持从一个Object转为另一个Object。除了Converter接口之外,实现ConverterFactory接口和GenericConverter接口也可以实现我们自己的类型转换逻辑。

Converter接口

首先看看Converter接口的定义


public interface Converter<S, T> {       
    T convert(S source);     
} 

可以看到这个接口是使用了泛型的,S表示原类型,T表示目标类型,然后里面定义了一个convert方法,将原类型对象作为参数传入进行转换之后返回目标类型对象。

下面在Spring Boot中使用Converter接口来实现将String类型分别转换为Data,自定义对象和List<自定义对象>。

添加依赖

添加spring-boot-starter-WEB依赖


        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>

实体类

1.User类


public class User {
  private long  id;
  //用户名
  private String name;
  //出生日期
  private Date birth;
  //关联用户
  private User linkUser;
  //喜欢的文章
  private List<Article> favArticles=new ArrayList<>();
 //下面省略Getter和Setter方法

2.Article类


public class Article {
  //文章id
  private long artId;
  //文章名
  private String artName;
  
 //下面省略Getter和Setter方法
}

配置类型转化器

下面三个类都需要添加@Component注解,否则不能生效。并实现Spring提供的org.springframework.core.convert.converter.Converter接口,重写其中的convert()方法 ,方法中写自己的转换逻辑。

1.定义全局日期转换器


@Component
public class DateConvert implements Converter<String,Date> {
  //日期格式
 SimpleDateFORMat sdf=new SimpleDateFormat("yyyy-MM-dd");
  @Override
  public Date convert(String s) {
    if (s!=null&&!"".equals(s)){
      try {
        //解析参数
        Date date=sdf.parse(s);
        return date;
      } catch (ParseException e) {
        e.printStackTrace();
      }
    }
    return null;
  }
}

2.定义全局对象转换器

这里使用Jackson的ObjectMapper类的readValue()函数实现将JSON字符串反序列化为Java对象


@Component
public class ObjectConvert implements Converter<String,User> {
  @Override
  public User convert(String s) {
    ObjectMapper objectMapper=new ObjectMapper();
    if (s!=null&&!"".equals(s)){
      try {
        User user=objectMapper.readValue(s,User.class);
        return user;
      } catch (jsonProcessingException e) {
        e.printStackTrace();
      }
    }
    return null;
  }
}

3.定义全局List类型转换器

这里使用Jackson的ObjectMapper类的readValue()函数实现将Json字符串反序列化为 List


@Component
public class StringToListController implements Converter<String, List<Article>> {
 ObjectMapper objectMapper=new ObjectMapper();
  @Override
  public List<Article> convert(String s) {
    List<Article> list=null;
    try {
       list=objectMapper.readValue(s, new TypeReference<List<Article>>() {
      });
    } catch (JsonProcessingException e) {
      e.printStackTrace();
    }
    return list;
  }
}

控制器

这里注意使用produces设置返回数据的类型为json,consumes设置提交内容的类型为:application/x-www-form-urlencoded。

application/x-www-form-urlencoded作用:将键值对的参数用&连接起来,如果有空格,将空格转换为+加号;有特殊符号,将特殊符号转换为ASCII HEX值。


@RestController
public class HelloController {
  @GetMapping("hello")
  public Date getDate(Date birth){
    System.out.println(birth);
    return birth;
  }
  @PostMapping(value="showUser",produces="application/json",
          consumes = "application/x-www-form-urlencoded")
  public User showUser(User user){
    return user;
  }
}

测试

在Postman中进行测试,注意以下设置:POST请求 -> Body -> x-www-form-urlencoded。在Body中输入参数进行测试。

因为参数中有Json类型参数,如果直接使用Params下进行发送数据,会出现请求参数异常错误。

在这里插入图片描述

测试结果:

在这里插入图片描述

Converter使用及其原理

在Spring mvc开发中,我们可以很方便的使用Converter来实现对请求参数的处理,比如字符串去空,日期格式化等。

配置文件中对Converter的引用


<!-- 属性编辑器 -->
    <bean id="conversionService"
        class="org.springframework.format.support.FormattinGConversionServiceFactoryBean">
        <property name="converters">
            <list>
                <bean class="com.xxx.common.converter.StringTrimConverter" />
                <bean class="com.xxx.common.converter.DateConverter" />
                <bean class="com.xxx.common.converter.DatetimeConverter" />
            </list>
        </property>
    </bean>
<mvc:annotation-driven conversion-service="conversionService">

如上代码,我们配置了三种类型的Converter。

以字符串去空为例


import org.springframework.core.convert.converter.Converter;

public class StringTrimConverter implements Converter<String, String> {
    public String convert(String source) {
        //如果源字符串不为空则进行转换
        if(source != null){
            //去除源字符串前后空格
            source = source.trim();
            if(source.equals("")){ 
                source = null;
            }
        }
        return source;
    }
}

配置好以上内容,即可在我们的请求中实现字符串自动去空格。

明白使用其实很简单,我们可以看下在Spring的底层,具体是如何实现Converter的。我们以字符串去空的代码为例。

以上代码,首先实现了Converter接口

我们查看Converter接口的源码



public interface Converter<S, T> {
    
    T convert(S source);
}

通过JavaDoc我们可以看到,实现该接口,可以使我们将S类型的对象转换为T类型。那么对应的我们对于Date类型的转换,就可写为如下代码:


public class DateConverter implements Converter
<bean id="conversionService"
        class="org.springframework.format.support.FormattingConversionServiceFactoryBean">

该类的对象,继续查看对应改类的源码,以及对应的JavaDoc。我们可以在该类的Doc中看到如下描述:


* <p>Like all {@code FactoryBean} implementations, this class is suitable for
 * use when configuring a Spring application context using Spring {@code <beans>}
 * XML. When configuring the container with
 * {@link org.springframework.context.annotation.Configuration @Configuration}
 * classes, simply instantiate, configure and return the appropriate
 * {@code FormattingConversionService} object from a
 * {@link org.springframework.context.annotation.Bean @Bean} method.

该类适用于适用XML构建Spring应用。

我们查看对应的成员变量:


public class FormattingConversionServiceFactoryBean
        implements FactoryBean<FormattingConversionService>, EmbeddedValueResolverAware, InitializingBean {
    private Set<?> converters;
    private Set<?> formatters;
    private Set<FormatterReGIStrar> formatterRegistrars;
    private boolean registerDefaultFormatters = true;
    private StringValueResolver embeddedValueResolver;
    private FormattingConversionService conversionService;

在配置XML时,我们主要配置了集合类的converters,该类比较重要的方法如下:


@Override
    public void afterPropertiesSet() {
        this.conversionService = new DefaultFormattingConversionService(this.embeddedValueResolver, this.registerDefaultFormatters);
        ConversionServiceFactory.registerConverters(this.converters, this.conversionService);
        registerFormatters();
    }

该方法实现了对conversionService中增减我们对应的格式化器。

在Spring启动时,注册转换器 时会进入afterPropertiesSet 方法。在该方法中,我们可以看到Spring以HashSet来存储对应的converters。在ConversionServiceFactory中,判断不同的转换器,并进行注册。


public static void registerConverters(Set<?> converters, ConverterRegistry registry) {
        if (converters != null) {
            for (Object converter : converters) {
                if (converter instanceof GenericConverter) {
                    registry.addConverter((GenericConverter) converter);
                }
                else if (converter instanceof Converter<?, ?>) {
                    registry.addConverter((Converter<?, ?>) converter);
                }
                else if (converter instanceof ConverterFactory<?, ?>) {
                    registry.addConverterFactory((ConverterFactory<?, ?>) converter);
                }
                else {
                    throw new IllegalArgumentException("Each converter object must implement one of the " +
                            "Converter, ConverterFactory, or GenericConverter interfaces");
                }
            }
        }
    }

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

--结束END--

本文标题: Spring Boot中如何使用Convert接口实现类型转换器

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

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

猜你喜欢
  • Spring Boot中如何使用Convert接口实现类型转换器
    目录使用Convert接口实现类型转换器Converter接口添加依赖实体类1.User类2.Article类配置类型转化器1.定义全局日期转换器2.定义全局对象转换器3.定义全局L...
    99+
    2024-04-02
  • go语言接口类型如何转换
    这篇文章主要介绍“go语言接口类型如何转换”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“go语言接口类型如何转换”文章能帮助大家解决问题。go语言可利用类型断言来进行接口类型。在Go中,无论是将一个...
    99+
    2023-07-05
  • java如何实现类型转换与强制类型转换
    这篇文章主要介绍了java如何实现类型转换与强制类型转换,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。java类型转换与强制类型转换如果你以前有编程经验,那么你已经知道把一种...
    99+
    2023-06-03
  • PHP如何使用函数实现类型转换
    这篇文章主要介绍了PHP如何使用函数实现类型转换,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。转换函数转换通过intval() floatval() strval()三个转换...
    99+
    2023-06-17
  • MySQL如何实现类型转换
    这篇文章主要介绍了MySQL如何实现类型转换,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。类型转换命令: CAST(expr AS type...
    99+
    2024-04-02
  • javascript如何实现类型转换
    这篇文章给大家分享的是有关javascript如何实现类型转换的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。方法:1、使用“+”运算符自动进行转换。2、使用JS内置的函数进行转换,例toString()和Stri...
    99+
    2023-06-14
  • Spring中的类型转换器怎么定义使用
    这篇文章主要讲解了“Spring中的类型转换器怎么定义使用”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Spring中的类型转换器怎么定义使用”吧!1.类型转换器作用类型的转换赋值2.自定义...
    99+
    2023-07-04
  • php image类型如何实现转换
    本篇内容主要讲解“php image类型如何实现转换”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“php image类型如何实现转换”吧!php image类型实现转换的方法:1、创建一个PHP...
    99+
    2023-06-22
  • spring boot拦截器如何使用spring AOP实现
    本篇文章为大家展示了spring boot拦截器如何使用spring AOP实现,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。在spring boot中,简单几步,使用spring AOP实现一个拦...
    99+
    2023-05-31
    springboot spring aop 拦截器
  • 使用spring-boot如何实现整合dubbo中的Spring-boot-dubbo-starter
    使用spring-boot如何实现整合dubbo中的Spring-boot-dubbo-starter?相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。在application.p...
    99+
    2023-05-31
    springboot art dubbo
  • Spring rest接口中的LocalDateTime日期类型转时间戳怎么实现
    这篇“Spring rest接口中的LocalDateTime日期类型转时间戳怎么实现”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我...
    99+
    2023-07-05
  • 在spring boot项目中如何实现使用thymeleaf实现页面跳转
    本篇文章为大家展示了在spring boot项目中如何实现使用thymeleaf实现页面跳转,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。前言在学习springboot 之后想结合着html做个小d...
    99+
    2023-05-31
    springboot thymeleaf 页面跳转
  • ASP 中如何使用二维码 API 实现数据类型转换?
    随着移动互联网的普及,二维码已经成为了一种十分常见的信息传递方式。在 ASP 开发中,我们经常需要将一些数据转换成二维码来方便用户扫描获取信息。那么,ASP 中如何使用二维码 API 实现数据类型转换呢?本文将为您详细介绍。 一、二维码 ...
    99+
    2023-07-08
    二维码 api 数据类型
  • js如何实现类型强制转换
    这篇文章主要介绍js如何实现类型强制转换,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!类型强制转换1 string强制转换为数字可以用*1来转化为数字(实际上是调用.valueOf方...
    99+
    2024-04-02
  • Python数据类型转换如何实现
    这篇文章主要介绍了Python数据类型转换如何实现的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇Python数据类型转换如何实现文章都会有所收获,下面我们一起来看看吧。基本类型转换python3与python2...
    99+
    2023-07-04
  • MybatisPlus字段类型转换如何实现
    本文小编为大家详细介绍“MybatisPlus字段类型转换如何实现”,内容详细,步骤清晰,细节处理妥当,希望这篇“MybatisPlus字段类型转换如何实现”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。resul...
    99+
    2023-07-05
  • 如何在ASP中使用Spring接口实现同步?
    ASP是一种非常流行的Web开发技术,而Spring则是一个非常流行的Java开发框架。这篇文章将介绍如何在ASP中使用Spring接口实现同步。 什么是Spring Spring是一个非常流行的Java开发框架,它提供了丰富的功能和工...
    99+
    2023-09-02
    同步 spring 接口
  • PHP接口中如何处理重定向的数据类型转换?
    PHP是一种广泛使用的编程语言,它可以用来开发Web应用程序。在Web应用程序中,接口是非常常见的一种开发方式。接口可以让Web应用程序与其他系统进行交互,以便实现数据的共享和传输。在接口开发中,重定向是一个非常常见的问题,因为它涉及到数据...
    99+
    2023-10-21
    接口 重定向 数据类型
  • Spring Boot 中如何使用 JDBC 连接 MySQL
    这篇文章将为大家详细讲解有关Spring Boot 中如何使用 JDBC 连接 MySQL,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。01、初始化 MyS...
    99+
    2024-04-02
  • MySQL数据库中CAST与CONVERT函数实现类型转换的示例分析
    这篇文章主要为大家展示了“MySQL数据库中CAST与CONVERT函数实现类型转换的示例分析”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“MySQL数据库中C...
    99+
    2024-04-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作