java converter转换器_springboot 自定义转换器(converter)
springboot?自定義轉換器(converter)
應用:實現一對一轉換,如將字符串轉換為pojo、枚舉等
***********************
相關類與接口
Converter
@FunctionalInterface
public interface Converter {
@Nullable
T convert(S source); //將類型S的對象轉換為類型T的對象
}
ConverterFactory
public interface ConverterFactory {
Converter getConverter(Class targetType);
}
********************
部分內置converter、converterFactory
EnumToStringConverter:將枚舉字面量轉換為字符串
final class EnumToStringConverter extends AbstractConditionalEnumConverter implements Converter, String> {
public EnumToStringConverter(ConversionService conversionService) {
super(conversionService);
}
@Override
public String convert(Enum> source) {
return source.name();
}
}
StringToNumerConverterFactory:字符串轉換為數字
final class StringToNumberConverterFactory implements ConverterFactory {
@Override
public Converter getConverter(Class targetType) {
return new StringToNumber<>(targetType);
}
private static final class StringToNumber implements Converter {
private final Class targetType;
public StringToNumber(Class targetType) {
this.targetType = targetType;
}
@Override
public T convert(String source) {
if (source.isEmpty()) {
return null;
}
return NumberUtils.parseNumber(source, this.targetType);
}
}
}
StringToEnumConverterFactory:根據枚舉字面量將字符串轉換為枚舉對象
final class StringToEnumConverterFactory implements ConverterFactory {
@Override
public Converter getConverter(Class targetType) {
return new StringToEnum(ConversionUtils.getEnumType(targetType));
}
private static class StringToEnum implements Converter {
private final Class enumType;
public StringToEnum(Class enumType) {
this.enumType = enumType;
}
@Override
public T convert(String source) { //根據枚舉的字面量進行轉換
if (source.isEmpty()) {
// It's an empty enum identifier: reset the enum value to null.
return null;
}
return (T) Enum.valueOf(this.enumType, source.trim());
}
}
}
***********************
示例:自定義枚舉轉換器,根據枚舉屬性進行轉換
********************
myenum?層
Sex
public enum Sex {
Male(1,"男"),Female(2,"女");
private Integer id;
private String name;
Sex(Integer id,String name){
this.id=id;
this.name=name;
}
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
@Override
public String toString() {
return "Sex{" +
"id=" + id +
", name='" + name + '\'' +
'}';
}
}
********************
pojo?層
Person
@Data
public class Person {
private String name;
private Integer age;
private Sex sex;
}
********************
config?層
StringToEnumConverter:根據屬性name將字符串轉換為枚舉對象
@Component
public class StringToEnumConverter implements Converter {
@Override
public Sex convert(String source) {
Sex sex=Sex.Male;
if ("女".equals(source)){
sex=Sex.Female;
}
return sex;
}
}
說明:將轉換器注冊為容器bean后,可自動注冊,不需要使用WebMvcConfigurer
WebConfig:注冊converter
@Component
public class WebConfig implements WebMvcConfigurer {
@Resource
private StringToEnumConverter stringToEnumConverter;
@Override
public void addFormatters(FormatterRegistry registry) {
registry.addConverter(stringToEnumConverter);
}
}
********************
controller?層
HelloController
@RestController
public class HelloController {
@RequestMapping("/hello")
public String hello(Sex sex){
System.out.println(sex);
return "success";
}
@RequestMapping("/hello2")
public String hello2(Person person){
System.out.println(person);
return "success";
}
}
***********************
默認枚舉轉換器測試
localhost:8080/hello?sex=Male
2020-07-11 10:09:53.896 INFO 6652 --- [nio-8080-exec-2] o.s.web.servlet.DispatcherServlet : Initializing Servlet 'dispatcherServlet'
2020-07-11 10:09:53.908 INFO 6652 --- [nio-8080-exec-2] o.s.web.servlet.DispatcherServlet : Completed initialization in 12 ms
Sex{id=1, name='男'}
localhost:8080/hello?sex=男
2020-07-11 10:08:33.021 INFO 14848 --- [nio-8080-exec-1] o.s.web.servlet.DispatcherServlet : Completed initialization in 5 ms
2020-07-11 10:08:33.056 WARN 14848 --- [nio-8080-exec-1] .w.s.m.s.DefaultHandlerExceptionResolver : Resolved [org.springframework.web.method.annotation.MethodArgumentTypeMismatchException: Failed to convert value of type 'java.lang.String' to required type 'com.example.demo.myenum.Sex'; nested exception is org.springframework.core.convert.ConversionFailedException: Failed to convert from type [java.lang.String] to type [com.example.demo.myenum.Sex] for value '男'; nested exception is java.lang.IllegalArgumentException: No enum constant com.example.demo.myenum.Sex.男]
說明:默認的枚舉轉換器根據字面量進行轉換,使用屬性轉換會報錯
***********************
自定義枚舉轉換器測試
localhost:8080/hello?sex=女
2020-07-11 10:00:03.110 INFO 13032 --- [nio-8080-exec-1] o.s.web.servlet.DispatcherServlet : Initializing Servlet 'dispatcherServlet'
2020-07-11 10:00:03.119 INFO 13032 --- [nio-8080-exec-1] o.s.web.servlet.DispatcherServlet : Completed initialization in 9 ms
Sex{id=2, name='女'}
localhost:8080/hello2?name=瓜田李下&age=20&sex=女
Person(name=瓜田李下, age=20, sex=Sex{id=2, name='女'})
說明:自定義枚舉轉換器生效,可根據枚舉屬性進行轉換
本文地址:https://blog.csdn.net/weixin_43931625/article/details/107279831
如您對本文有疑問或者有任何想說的,請點擊進行留言回復,萬千網友為您解惑!
與50位技術專家面對面20年技術見證,附贈技術全景圖總結
以上是生活随笔為你收集整理的java converter转换器_springboot 自定义转换器(converter)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: java 脚本引擎性能_Java SE
- 下一篇: java ssm常用注解_SSM框架中常