Spring基础篇:自定义类型转换和中文字符串返回乱码

160 阅读2分钟

开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第28天,点击查看活动详情

场景使用

前端提交的数据到后端转换中出现了问题,常见的一种情况是:日期的转换。由于前端常使用日期选择器选择日期,它的格式常有:2022/12/20或者2022-12-20这样,传递的时候会以字符串的形式传递。后端定义Bean的时候,属性成员通常是DATE类型,若没有定义规则时,转换出错

Spring的解决方案:定义类型转换器

该类型转换器通过要与SpringMVC相结合使用,这里了解它具体怎么使用即可。

1.实现Converter接口

接口Converter提供了泛型ST

  • S表示:Source,是指被转换的类型,这里是指String类型
  • T表示:Target,是指需要转换成什么类型,这里是指Date类型
public interface Converter<S, T> {

编写一个名为:String2Date类,实现Converter接口。

注意:Converter接口在jackson包中或者其他包中也有。这里需要导入的是org.springframework.core.convert.converter.Converter包中的。

public class String2Date implements Converter<String,Date> {

    @Override
    public Date convert(String source) {
        if (StringUtils.hasText(source)) {
            SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd");
            try {
                return dateFormat.parse(source);
            } catch (ParseException e) {
                return null;
            }
        }
        return null;
    }
}

这里使用的是SimpleDateFormat转换的是xxxx-xx-xx格式的字符串

2.在配置类中实现WebMvcConfigurer接口,开启@EnableWebMvc注解

这里的配置类是指MVC的配置类,通常第一步做的工作就是实现WebMvcConfigurer接口,然后选择性的实现其中的方法,这里我们需要实现的是addFormatters方法,添加自定义类型转换的类。

public class EnableWebMvcConfiguration implements WebMvcConfigurer {
    @Override
    public void addFormatters(FormatterRegistry registry) {
        registry.addConverter(new String2DateConverter());
    }
}

配置类需要加的注解@Configuration,除此之外还需要加上@EnableWebMvc表示支持MVC的配置(因为WebMvcConfigurer接口就是属于MVC的配置)。

以上就是Spring-Web方面,前后端数据传递时,字符串转Date的方法。

单元测试

可以单独写一个单元测试,测试String2Date类。IDEA可以通过ALT+INSERT轻松创建单元测试。

SpringMVC使用@ResponseBody返回中文字符串,乱码

这里写了一个/demo的请求,使用PostMan测试的时候,会显示乱码。

@GetMapping("/demo")
@ResponseBody
public String demo(){
    return "你好";
}

乱码的问题是因为SpringMVC默认的返回编码: Content-Type:"text/plain;charset=ISO-8859-1" image.png 这个编码在返回中文值的时候会产生乱码,解决方法是,重新设置一下SpringMVC关于字符串的返回编码。

这里以注解方式为主,贴上核心的代码,该代码是SpringMVC配置类(配置类需要实现该接口implements WebMvcConfigurer

@Bean
public HttpMessageConverter<String> responseBodyConverter() {
    return new StringHttpMessageConverter(StandardCharsets.UTF_8);
}

@Override
public void configureMessageConverters(List<HttpMessageConverter<?>> converters) {
    WebMvcConfigurer.super.configureMessageConverters(converters);
    converters.add(responseBodyConverter());
}

设置完成之后,再次测试。 Content-Type:"text/plain;charset=UTF-8" image.png 解决了中文乱码问题。