Spring Boot中使用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下进行发送数据,会出现请求参数异常错误。
在这里插入图片描述
测试结果:
在这里插入图片描述

好的,我可以为您介绍如何在 Spring Boot 项目中实现 Converter 接口,自定义类型转换器。 首先,您需要创建一个类来实现 Converter 接口,并重写其中的 convert() 方法。在 convert() 方法中,您可以编写自定义转换逻辑,将一个类型转换为另一个类型。 举个例子,比如您需要将一个字符串转换为一个自定义的日期类型。您可以编写如下的代码: ```java import java.text.SimpleDateFormat; import java.util.Date; import org.springframework.core.convert.converter.Converter; public class StringToDateConverter implements Converter<String, Date> { private static final String DATE_FORMAT = "yyyy-MM-dd"; @Override public Date convert(String source) { try { SimpleDateFormat dateFormat = new SimpleDateFormat(DATE_FORMAT); return dateFormat.parse(source); } catch (Exception e) { return null; } } } ``` 在上面的代码中,我们实现了一个将字符串转换为日期类型转换器。在 convert() 方法中,我们使用 SimpleDateFormat 类将字符串转换为日期类型。如果转换失败,我们返回 null。 接下来,您需要在 Spring Boot 项目中注册这个转换器。您可以在配置类中添加如下的代码: ```java import org.springframework.context.annotation.Configuration; import org.springframework.format.FormatterRegistry; import org.springframework.web.servlet.config.annotation.WebMvcConfigurer; @Configuration public class WebConfig implements WebMvcConfigurer { @Override public void addFormatters(FormatterRegistry registry) { registry.addConverter(new StringToDateConverter()); } } ``` 在上面的代码中,我们创建了一个 WebMvcConfigurer 配置类,并重写了其中的 addFormatters() 方法。在 addFormatters() 方法中,我们将我们自定义的转换器实例添加到了 FormatterRegistry 中。 现在,我们已经成功地实现了一个自定义的类型转换器,并将其注册到了 Spring Boot 项目中。当我们需要将一个字符串转换为日期类型时,Spring Boot 将自动调用我们实现转换器
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值