SpringBoot自定义返回值类型,格式转换等

springmvc默认采用MappingJackson2HttpMessageConverter将dto对象序列化为Json字符串,如果不加配置的话,返回的json数据中 时间格式可能不是很直观。笔者发现改变jackson的配置来实现这一需求。

方案一

配置文件中添加

spring:
    jackson:
        date-format: yyyy-MM-dd HH:mm:ss

方案二
如果想进一步对jackson进行配置(比如BigDecimal转化为String),可以使用这种方式。


/**
 * 时间配置
 * BigDecimal转String配置
 * Null值处理
 */
@Configuration
public class WebMvcConfiguration implements WebMvcConfigurer {


//通过springmvc提供的配置接口
    @Override
    public void extendMessageConverters(List<HttpMessageConverter<?>> converters) {
        //配置jackson
        converters.stream().filter(c -> c instanceof MappingJackson2HttpMessageConverter).forEach(cvt -> {
            MappingJackson2HttpMessageConverter converter = (MappingJackson2HttpMessageConverter) cvt;
            ObjectMapper objectMapper = converter.getObjectMapper();
            objectMapper.setDateFormat(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"));
            objectMapper.setTimeZone(TimeZone.getDefault());

            //处理null值
            objectMapper.getSerializerProvider().setNullValueSerializer(NullValueJsonSerializer.instance);
            //objectMapper.setSerializationInclusion(JsonInclude.Include.NON_NULL);
            //通过该方法对mapper对象进行设置,所有序列化的对象都将按改规则进行系列化
            //Include.Include.ALWAYS 默认
            //Include.NON_DEFAULT 属性为默认值不序列化
            //Include.NON_EMPTY 属性为 空(“”) 或者为 NULL 都不序列化
            //Include.NON_NULL 属性为NULL 不序列化


            SimpleModule module = new SimpleModule();
            module.addSerializer(BigDecimal.class, BigDecimalToStringSerializer.instance);
            objectMapper.registerModule(module);

        });
    }


    public static class NullValueJsonSerializer extends JsonSerializer<Object> {

        public static final NullValueJsonSerializer instance = new NullValueJsonSerializer();

        @Override
        public void serialize(Object o, JsonGenerator jsonGenerator, SerializerProvider serializerProvider) throws IOException {

            String fieldName = jsonGenerator.getOutputContext().getCurrentName();
            try {
                Field field = jsonGenerator.getCurrentValue().getClass().getDeclaredField(fieldName);
                if (Objects.equals(field.getType(), String.class)) {
                    //字符串型空值""
                    jsonGenerator.writeString("");
                } else if (Objects.equals(field.getType(), Collection.class)) {
                    //列表型空值返回[]
                    jsonGenerator.writeStartArray();
                    jsonGenerator.writeEndArray();
                } else if (Objects.equals(field.getType(), Map.class)) {
                    //map型空值返回{}
                    jsonGenerator.writeStartObject();
                    jsonGenerator.writeEndObject();
                } else if (Objects.equals(field.getType(), Boolean.class)) {
                    //todo Boolean处理待定
                    jsonGenerator.writeBoolean(false);
                } else {
                    jsonGenerator.writeString("");
                }

            } catch (Exception e) {
                e.printStackTrace();
            }

        }
    }

    public static class BigDecimalToStringSerializer extends StdSerializer<BigDecimal> {
        public static final BigDecimalToStringSerializer instance = new BigDecimalToStringSerializer();

        public BigDecimalToStringSerializer() {
            super(BigDecimal.class);
        }

        @Override
        public boolean isEmpty(SerializerProvider prov, BigDecimal value) {
            return value == null;
        }

        @Override
        public void serialize(BigDecimal bigDecimal, JsonGenerator jsonGenerator, SerializerProvider serializerProvider) throws IOException {
            jsonGenerator.writeString(bigDecimal.toPlainString());
        }
    }
}


  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
Spring Boot转换器是一种用于将输入数据从一种类型转换为另一种类型的机制。转换器用于将HTTP请求中的请求参数转换为控制器方法参数的类型,并将控制器方法的返回值转换为HTTP响应的类型。 Spring Boot提供了许多内置的转换器,例如: - StringToIntegerConverter:将字符串转换为整数。 - StringToBooleanConverter:将字符串转换为布尔值。 - StringToEnumConverter:将字符串转换为枚举类型。 - StringToLocalDateConverter:将字符串转换为本地日期。 - StringToLocalDateTimeConverter:将字符串转换为本地日期时间。 除了内置转换器之外,Spring Boot还允许开发人员创建自定义转换器。自定义转换器应实现Converter接口,该接口定义了两个方法:convert()和getType()。convert()方法将输入数据转换为目标类型,getType()方法返回目标类型的Class对象。 要注册自定义转换器,可以使用ConversionService或FormatterRegistry。ConversionService是一个通用的类型转换服务,FormatterRegistry用于注册格式化程序和转换器。可以使用@Configuration类中的addFormatters()方法将转换器添加到FormatterRegistry中。例如: ``` @Configuration public class MyConfig implements WebMvcConfigurer { @Override public void addFormatters(FormatterRegistry registry) { registry.addConverter(new MyConverter()); } } ``` 上述代码将MyConverter添加到FormatterRegistry中。现在,Spring Boot应用程序将使用MyConverter将输入数据从一种类型转换为另一种类型

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值