SpringMVC 之 格式化器和转换器(五)

本文介绍了SpringMVC中的内置转换器,如日期和数值格式化,以及如何自定义转换器如StringToCarConverter。重点讲解了自定义实体类、控制器、格式化器和如何通过注解进行数据格式化。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

内置的转换器

    (1) 标量转换器

名称作用
StringToBooleanConverterString 到 boolean 类型转换
ObjectToStringConverterObject 到 String 转换,调用 toString 方法转换
StringToNumberConverterFactoryString 到数字转换(例如 Integer、Long 等)
NumberToNumberConverterFactory数字子类型(基本类型)到数字类型(包装类型)转换
StringToCharacterConverterString 到 Character 转换,取字符串中的第一个字符
NumberToCharacterConverter数字子类型到 Character 转换
CharacterToNumberFactoryCharacter 到数字子类型转换
StringToEnumConverterFactoryString 到枚举类型转换,通过 Enum.valueOf 将字符串转换为需要的枚举类型
EnumToStringConverter枚举类型到 String 转换,返回枚举对象的 name 值
StringToLocaleConverterString 到 java.util.Locale 转换
PropertiesToStringConverterjava.util.Properties 到 String 转换,默认通过 ISO-8859-1 解码
StringToPropertiesConverterString 到 java.util.Properties 转换,默认使用 ISO-8859-1 编码

 

 (2) 集合、数组相关转换器

名称作用
ArrayToCollectionConverter任意数组到任意集合(List、Set)转换
CollectionToArrayConverter任意集合到任意数组转换
ArrayToArrayConverter任意数组到任意数组转换
CollectionToCollectionConverter集合之间的类型转换
MapToMapConverterMap之间的类型转换
ArrayToStringConverter任意数组到 String 转换
StringToArrayConverter字符串到数组的转换,默认通过“,”分割,且去除字符串两边的空格(trim)
ArrayToObjectConverter任意数组到 Object 的转换,如果目标类型和源类型兼容,直接返回源对象;否则返回数组的第一个元素并进行类型转换
ObjectToArrayConverterObject 到单元素数组转换
CollectionToStringConverter任意集合(List、Set)到 String 转换
StringToCollectionConverterString 到集合(List、Set)转换,默认通过“,”分割,且去除字符串两边的空格(trim)
CollectionToObjectConverter任意集合到任意 Object 的转换,如果目标类型和源类型兼容,直接返回源对象;否则返回集合的第一个元素并进行类型转换
ObjectToCollectionConverterObject 到单元素集合的类型转换

自定义转换器

1.创建实体类

Car.java

package com.corner.boot.bean;

import lombok.Data;
import org.springframework.stereotype.Component;

@Data
@Component
public class Car {
    private String brand;
    private double price;
    @Override
    public String toString() {
        return "Car{" +
                "brand='" + brand + ''' +
                ", price=" + price +
                '}';
    }
}

2.创建控制器类

ParamController.java

package com.corner.boot.controller;

import com.corner.boot.bean.Car;
import org.springframework.web.bind.annotation.*;

@RestController
@ResponseBody
@RequestMapping("/parameter")
public class ParamController {
    @GetMapping("/converter")
    public Car car(@RequestParam("carStr") Car carStr) {
        System.out.println(carStr);
        return carStr;
    }
}

3.创建自定义格式化转换器类

StringToCarConverter.java

/**参数转换
 * 将BYD,12.22字符串转换成Car对象
 */
package com.corner.boot.config.converter;

import com.corner.boot.bean.Car;
import org.springframework.core.convert.converter.Converter;
import org.springframework.stereotype.Component;
import org.springframework.util.StringUtils;
import static java.lang.Double.parseDouble;

@Component
public class StringToCarConverter implements Converter<String,Car> {
    @Override
    public Car convert(String s) {
        if(!StringUtils.isEmpty(s)){
            Car car = new Car();
            String[] arr = s.split(",");
            car.setBrand(arr[0]);
            car.setPrice(parseDouble(arr[1]));
            return car;
        }
        return null;
    }
}

在使用时,必须编写一个实现org.springframework.core.convert.converter.Converter接口的java类,这里的S表示源类型,T表示目标类型。

4.将自定义的转换器注册到WebMvcConfigurer中

package com.corner.boot.config;

import com.corner.boot.config.converter.StringToCarConverter;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.format.FormatterRegistry;
import org.springframework.stereotype.Component;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;

@Component
public class WebConfigurer implements WebMvcConfigurer {
    @Autowired
    StringToCarConverter StringToCarConverter;
    @Override
    public void addFormatters(FormatterRegistry registry) {
        registry.addConverter(StringToCarConverter);
    }
}

5.请求测试

请求接口路径

http://127.0.0.1:9999/parameter/converter?carStr=BYD,12.22

转换结果

Car{brand='BYD', price=12.22}

格式化器(Formatter)

在实际的项目开发中,经常会涉及到一些需要进行格式化的数据,例如金额、日期等。以金额为例,当金额为 10 万元时,在比较正式的场合往往要写成 ¥100000;而日期也可以被写作多种格式,例如 yyyy-MM-dd、yyyy-MM-dd hh:ss:mm 等。这些数据都要经过一定的格式化处理才能够正常使用。

Formatter接口
Spring 提供了一个 Formatter 接口, T 表示目标数据类型,它被称为格式化转换器。

Formatter 的作用与 Converter(类型转换器)相似,都是可以将一种数据类型转换成另一种数据类型。但不同的是,Formatter 的源类型必须是 String 类型,而 Converter 的源类型可以是任意数据类型。

package org.springframework.format;

public interface Formatter<T> extends Printer<T>, Parser<T> {
}

Formatter 接口继承了 Printer Parser 接口,其泛型 T 表示字符串需要转换的目标类型。 在 Printer Parser 接口中,分别包含一个 print() 方法和一个 parse() 方法。Spring MVC 中所有的格式化转换器实现类都必须重写(覆盖)这两个方法。

方法接口
T parse(String text, Locale locale) throws ParseException; Printer该方法能够将数据按照一定的格式输出成字符串。该方法中包含一个 Locale 类型的参数,即该方法可根据地区来做出相应的定制。
String print(T object, Locale locale); Parser该方法能够将满足一定格式的字符串转换为对象。其包含一个 Locale 类型的参数,即该方法可根据国家和地区做出相应的定制。

内置格式化转换器

Spring MVC 默认提供了多个内置的格式化器,通过它们,我们可以轻松地实现对日期(Date)类型和数值(Number)类型数据的格式化工作,具体如下。

内置格式化器说明
NumberFormatter实现 Number 与 String 之间的解析与格式化。
CurrencyFormatter实现 Number 与 String 之间的解析与格式化(带货币符号)。
PercentFormatter实现 Number 与 String 之间的解析与格式化(带百分数符号)。
DateFormatter实现 Date 与 String 之间的解析与格式化。

虽然 Formatter 与 Converter 存在一定的差异,但格式化转换本质上还是属于“类型转换”的范畴,因此在 Spring MVC 中 Formatter(格式化转换器)实际上是委托给 Converter 机制实现的。

Spring 的格式化模块中定义了一个 FormattingConversionService 类,它是 ConversionService 接口(类型转换器的服务接口)的实现类。它与其他的类型转换器实现类不同,它不仅具有类型转换功能,还具有格式化转换功能。

Spring MVC 还专门为 FormattingConversionService 提供了一个名为 FormattingConversionServiceFactroyBean 的工厂类,它主要作用就是在 Spring 上下文中构造 FormattingConversionService 的实例。

除此之外,FormattingConversionServiceFactroyBean 还为以下 2 个格式化注解提供了支持,使得我们可以更加方便地使用 Spring MVC 内置的格式化器,对数据进行格式化转换。

格式化注解说明
@DateTimeFormat 注解使用该注解,能够实现对日期类型数据的格式化
@NumberFormat 注解使用该注解,能够实现对数值类型数据的格式化

我们知道,只要 Spring MVC 的配置文件中配置一个 mvc:annotation-driven 标签,Spring MVC 在启动时就会自动初始化一个 FormattingConversionServiceFactoryBean 类型的实例:ConversionService。

也就是说,我们只要在 Spring MVC 配置文件中配置了 mvc:annotation-driven 标签,就可以直接在 Spring MVC 项目中使用 @NumberFormat 注解和 @DateTimeFormat 注解,对 Number 类型和 Date 类型数据进行格式化转换。

日期格式化

@DateTimeFormat 注解可对 java.util.Date、java.util.Calendar、java.long.Long 等时间类型的数据进行标注,以实现对日期类型的数据进行格式化处理。

@DateTimeFormat 注解主要包含以下 3 个属性。

属性类型说明
patternString用于指定解析或格式化日期时间的模式,其常用取值包括 yyyy-MM-dd、yyyy-MM-dd hh:mm:ss 等。
isoDateTimeFormat.ISO用于指定解析或格式化日期时间的 ISO 模式,其取值有 4 种:DATE:yyyy-MM-dd。TIME:hh:mm:ss:SSSZ。DATE_TIME:yyyy-MM-dd hh:mm:ss:SSSZ。NONE:无
styleString用于指定日期时间的格式。该属性由两个字符组成,第一个字符表示日期的格式,第二个字符表示时间的格式。S:短日期/时间格式。M:中日期/时间格式。L:长日期/时间格式。F:完整日期/时间格式。其默认值为“SS”,即日期和时间都采用短格式。

数值格式化

@NumberFormat 注解可以用来格式化任何数字基本类型(如 int、long 等)或 java.lang.Number 类型的实例(如 BigDecimal、Integer 等)。

@NumberFormat 注解拥有两个互斥的属性,如下表。

属性类型说明
styleNumberFormat.Style该属性用于指定数值的样式类型,其取值有以下 4 种:DEFAULT:默认类型/NUMBER:正常数值类型/PERCENT:百分数类型/CURRENCY:货币数值类型
patternString该属性用于自定义数值的样式星星,例如 #,###

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值