searchusermenu
  • 发布文章
  • 消息中心
点赞
收藏
评论
分享
原创

Java Spring框架设置参数类型转换规则

2024-05-27 01:59:18
11
0

本文介绍如何在使用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() {
    }
}
在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() {
        
        MappingJackson2HttpMessageConverter jackson2HttpMessageConverter = new MappingJackson2HttpMessageConverter();
        ObjectMapper objectMapper = new ObjectMapper();
        objectMapper.configure(MapperFeature.ALLOW_COERCION_OF_SCALARS, false);
        jackson2HttpMessageConverter.setObjectMapper(objectMapper);
        return jackson2HttpMessageConverter;
    }
}
如此设置之后,若再次尝试参数类型转换,则会得到以下报错:
org.springframework.http.converter.HttpMessageNotReadableException: JSON parse error: Cannot coerce String value ("1") to `java.lang.Long` value
说明此时参数类型强制校验已开启。
0条评论
0 / 1000
吴****钢
2文章数
0粉丝数
吴****钢
2 文章 | 0 粉丝
吴****钢
2文章数
0粉丝数
吴****钢
2 文章 | 0 粉丝
原创

Java Spring框架设置参数类型转换规则

2024-05-27 01:59:18
11
0

本文介绍如何在使用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() {
    }
}
在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() {
        
        MappingJackson2HttpMessageConverter jackson2HttpMessageConverter = new MappingJackson2HttpMessageConverter();
        ObjectMapper objectMapper = new ObjectMapper();
        objectMapper.configure(MapperFeature.ALLOW_COERCION_OF_SCALARS, false);
        jackson2HttpMessageConverter.setObjectMapper(objectMapper);
        return jackson2HttpMessageConverter;
    }
}
如此设置之后,若再次尝试参数类型转换,则会得到以下报错:
org.springframework.http.converter.HttpMessageNotReadableException: JSON parse error: Cannot coerce String value ("1") to `java.lang.Long` value
说明此时参数类型强制校验已开启。
文章来自个人专栏
文章 | 订阅
0条评论
0 / 1000
请输入你的评论
0
0