SpringMVC:自定义Converter

接着前一篇博客:SpringMVC:自定义参数绑定原理

测试

@Data
public class Person {
    private String userName;
    private Integer age;
    private Date birth;
    private Pet pet;
}
@Data
public class Pet {
    private String name;
    private String age;
}

index.html

这里,有一个属性pet,value以逗号分割,前面是name,后面是age

<form action="save" method="post">
    姓名: <input name="userName" value="admin"/> <br/>
    年龄: <input name="age" value="12"/> <br/>
    生日: <input name="birth" value="2021/01/01"/> <br/>
    宠物姓名:<input name="pet" value="cat,18"/><br/>
    <input type="submit" value="保存">
</form>

controller:

@PostMapping("save")
@ResponseBody
public Person save(Person person){
    return person;
}

先进行测试,直接报错了

SpringMVC:自定义Converter

自定义Converter

在springboot2中,我们对springmvc的组件做一些定制化工作的话,一般需要实现WebMvcConfigurer接口,仔细找一找,不难发现注册自定义canverter的方法:

	/**
	 * Add {@link Converter Converters} and {@link Formatter Formatters} in addition to the ones
	 * registered by default.
	 */
	default void addFormatters(FormatterRegistry registry) {
	}

接下来,我们就可以定制Converter了

@Configuration
public class WebConfig implements WebMvcConfigurer {
    @Override
    public void addFormatters(FormatterRegistry registry) {
        registry.addConverter(new Converter<String, Pet>(){
            @Override
            public Pet convert(String source) {
                if(StringUtils.isEmpty(source)) return null;
                String[] split = source.split(",");
                Pet pet = new Pet();
                pet.setName(split[0]);
                pet.setAge(split[1]);
                return pet;
            }
        });
    }
}

测试:

SpringMVC:自定义Converter

addFormatters源码

SpringMVC:自定义Converter