场景使用
前端提交的数据到后端转换中出现了问题,常见的一种情况是:日期的转换。由于前端常使用日期选择器选择日期,它的格式常有:2022/12/20
或者2022-12-20
这样,传递的时候会以字符串的形式传递。后端定义Bean的时候,属性成员通常是DATE
类型,若没有定义规则时,转换出错。
Spring的解决方案:定义类型转换器
该类型转换器通过要与SpringMVC
相结合使用,这里了解它具体怎么使用即可。
1.实现Converter
接口
接口Converter
提供了泛型S和T
- 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"
这个编码在返回中文值的时候会产生乱码,解决方法是,重新设置一下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"
解决了中文乱码问题。