SpringBoot-自定义转换器converter

3,963 阅读2分钟

目录

概述

1.创建实体类

2.创建控制器类

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

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

5.请求测试

选择Converter还是Formatter


概述

场景应用:自定义参数解析器,把接收到的字符串参数解析成自定义的对象。

项目目录结构

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}

选择Converter还是Formatter

Converter是一般工具,可以将一种类型转换成另一种类型。例如,将String转换成Date,或者将Long转换成Date。Converter既可以用在web层,也可以用在其它层中。
Formatter只能将String转成成另一种java类型。例如,将String转换成Date,但它不能将Long转换成Date。所以,Formatter适用于web层。为此,在Spring MVC应用程序中,选择Formatter比选择Converter更合适。