本文介绍如何在使用Java Spring框架时设置参数类型转换规则。
Java Spring框架默认使用jackson库来对接口定义的参数进行序列化和反序列化。例如,定义以下参数类:
public class User {
private Long id;
private String name;
}
并传入以下Json参数:
{
"id": 1,
"name": "Thomas"
}
Spring框架会将参数解析成对应的User实例:
User(id=1, name=Thomas)
jackson存在默认的参数类型转换行为,例如当id字段传入字符串类型的数字时:
{
"id": "1",
"name": "Thomas"
}
jackson会自动将id的字符串"1"转换成整型1,所以最终会得到同样的User实例:
User(id=1, name=Thomas)
jackson的参数类型转换行为可以让参数值在不同类型之间转换,对于某些应用场景十分方便。但是,如果我们想要强制进行参数类型校验,在参数值与参数类型不一致时拒绝转换,就需要对Spring框架的转换器规则进行配置。
首先需要定义WebMvcConfiguration类:
@Configuration
public class WebMvcConfiguration implements WebMvcConfigurer {
}
然后在其中加上configureMessageConverters和converter两个方法
@Configuration
public class WebMvcConfiguration implements WebMvcConfigurer {
@Override
public void configureMessageConverters(List<HttpMessageConverter<?>> converters) {
converters.add(converter());
}
@Bean
MappingJackson2HttpMessageConverter converter() {
public void configureMessageConverters(List<HttpMessageConverter<?>> converters) {
converters.add(converter());
}
@Bean
MappingJackson2HttpMessageConverter converter() {
}
}
在converter方法中可以对jackson的类型转换规则进行自定义,例如想要禁止字符串类型的数字转换为整型参数,可以禁用jackson中ALLOW_COERCION_OF_SCALARS这个选项:
@Configuration
public class WebMvcConfiguration implements WebMvcConfigurer {
@Override
public void configureMessageConverters(List<HttpMessageConverter<?>> converters) {
converters.add(converter());
}
@Bean
MappingJackson2HttpMessageConverter converter() {
public void configureMessageConverters(List<HttpMessageConverter<?>> converters) {
converters.add(converter());
}
@Bean
MappingJackson2HttpMessageConverter converter() {
MappingJackson2HttpMessageConverter jackson2HttpMessageConverter = new MappingJackson2HttpMessageConverter();
ObjectMapper objectMapper = new ObjectMapper();
objectMapper.configure(MapperFeature.ALLOW_COERCION_OF_SCALARS, false);
jackson2HttpMessageConverter.setObjectMapper(objectMapper);
return jackson2HttpMessageConverter;
return jackson2HttpMessageConverter;
}
}
如此设置之后,若再次尝试参数类型转换,则会得到以下报错:
org.springframework.http.converter.HttpMessageNotReadableException: JSON parse error: Cannot coerce String value ("1") to `java.lang.Long` value
说明此时参数类型强制校验已开启。