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

猜你喜欢

转载自blog.csdn.net/qq_43842093/article/details/132136041