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

  • 3
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
实现Spring Boot 实现 Word 在线预览,你可以使用 Apache POI 库来读取 Word 文件,并将其转换为 HTML 格式以供在线浏览。以下是一些基本步骤: 1. 添加 Apache POI 依赖 在 pom.xml 文件添加以下依赖: ```xml <dependency> <groupId>org.apache.poi</groupId> <artifactId>poi</artifactId> <version>5.0.0</version> </dependency> <dependency> <groupId>org.apache.poi</groupId> <artifactId>poi-ooxml</artifactId> <version>5.0.0</version> </dependency> ``` 2. 编写读取 Word 文件并转换为 HTML 的代码 编写一个类来读取 Word 文件,并将其转换为 HTML 格式。以下是一个简单的示例: ```java import java.io.ByteArrayOutputStream; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.IOException; import java.io.OutputStreamWriter; import org.apache.poi.xwpf.converter.core.FileURIResolver; import org.apache.poi.xwpf.converter.core.IURIResolver; import org.apache.poi.xwpf.converter.core.XWPFConverterException; import org.apache.poi.xwpf.converter.xhtml.XHTMLConverter; import org.apache.poi.xwpf.usermodel.XWPFDocument; public class WordToHtmlConverter { public static String convert(String filePath) throws IOException, XWPFConverterException { FileInputStream fis = new FileInputStream(filePath); XWPFDocument document = new XWPFDocument(fis); IURIResolver resolver = new FileURIResolver(new java.io.File("")); ByteArrayOutputStream baos = new ByteArrayOutputStream(); XHTMLConverter.getInstance().convert(document, baos, resolver); String content = baos.toString(); baos.close(); document.close(); fis.close(); return content; } } ``` 3. 编写 Spring Boot 控制 编写一个 Spring Boot 控制使用户可以通过浏览访问 Word 文件并在线预览。以下是一个简单的示例: ```java import org.springframework.core.io.InputStreamResource; import org.springframework.http.HttpHeaders; import org.springframework.http.MediaType; import org.springframework.http.ResponseEntity; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.PathVariable; @Controller public class WordPreviewController { @GetMapping("/preview/{filename}") public ResponseEntity<InputStreamResource> preview(@PathVariable String filename) throws IOException, XWPFConverterException { String filePath = "/path/to/word/files/" + filename + ".docx"; String htmlContent = WordToHtmlConverter.convert(filePath); HttpHeaders headers = new HttpHeaders(); headers.setContentType(MediaType.TEXT_HTML); return ResponseEntity.ok() .headers(headers) .body(new InputStreamResource(new ByteArrayInputStream(htmlContent.getBytes()))); } } ``` 4. 在线预览 Word 文件 启动 Spring Boot 应用程序并访问 URL `http://localhost:8080/preview/filename`,其 `filename` 是 Word 文件的名称(不包括扩展名)。将在浏览显示 Word 文件的 HTML 预览。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值