Spring boot 使用FastJsonHttpMessageConverter 导致Springboot注解失效处理

问题描述

想接收数组类型用字符串接收,因此使用了

    @Bean
    public HttpMessageConverters fastJsonHttpMessageConverters() {
        FastJsonHttpMessageConverter fastConverter = new FastJsonHttpMessageConverter();
        FastJsonConfig fastJsonConfig = new FastJsonConfig();

        List<SerializerFeature> list = new ArrayList<>();
        list.add(SerializerFeature.PrettyFormat);
        list.add(SerializerFeature.WriteMapNullValue);
        list.add(SerializerFeature.WriteNullStringAsEmpty);
        list.add(SerializerFeature.WriteNullListAsEmpty);
        list.add(SerializerFeature.QuoteFieldNames);
        list.add(SerializerFeature.WriteDateUseDateFormat);
        list.add(SerializerFeature.DisableCircularReferenceDetect);
        list.add(SerializerFeature.WriteBigDecimalAsPlain);

        fastJsonConfig.setSerializerFeatures(list.toArray(new SerializerFeature[list.size()]));

        fastConverter.setFastJsonConfig(fastJsonConfig);
        HttpMessageConverter<?> converter = fastConverter;
        fastJsonConfig.setSerializeFilters(new ValueFilter() {
            @Override
            public Object process(Object object, String name, Object value) {
                if ( value != null && value.getClass() == Long.class && value.toString().length()>17) {
                    return String.valueOf(value);
                }
                return value;
            }
        });
        return new HttpMessageConverters(converter);
    }

但是,这个会导致Spring boot的注解【@JsonInclude、@JsonSerialize、@JsonIgnore】等全部失效

解决办法

自定义处理

继承MappingJackson2HttpMessageConverter


import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import com.alibaba.fastjson.support.config.FastJsonConfig;
import com.fasterxml.jackson.databind.JavaType;
import com.fasterxml.jackson.databind.ser.std.ToStringSerializer;
import org.springframework.http.HttpInputMessage;
import org.springframework.http.converter.HttpMessageNotReadableException;
import org.springframework.http.converter.json.Jackson2ObjectMapperBuilder;
import org.springframework.http.converter.json.MappingJackson2HttpMessageConverter;

import java.io.IOException;
import java.io.InputStream;
import java.lang.reflect.Type;

/**
 * @Author zhangjing
 * @Date 2023/9/14
 */
public class MappingJackson2HttpMessageConverter2 extends MappingJackson2HttpMessageConverter {


    private FastJsonConfig fastJsonConfig = new FastJsonConfig();
//private final static LongToStringSerializer longToStringSerializer = new LongToStringSerializer();
    static Jackson2ObjectMapperBuilder jacksonObjectMapperBuilder = Jackson2ObjectMapperBuilder.json();



    //解决long值问题
    static {
        jacksonObjectMapperBuilder.serializerByType(Long.TYPE, ToStringSerializer.instance);
        jacksonObjectMapperBuilder.serializerByType(Long.class, ToStringSerializer.instance);


//jacksonObjectMapperBuilder.serializerByType(Long.class, longToStringSerializer);
//jacksonObjectMapperBuilder.serializerByType(Long.TYPE, longToStringSerializer);
    }

	//解决时间格式化问题
	   @Override
    protected void init(ObjectMapper objectMapper) {
        objectMapper.setDateFormat(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"));
        objectMapper.setTimeZone(TimeZone.getTimeZone("Asia/Shanghai"));
        super.init(objectMapper);
    }

    public MappingJackson2HttpMessageConverter2() {

        super(jacksonObjectMapperBuilder.build());
    }



    @Override
    public Object read(Type type, Class<?> contextClass, HttpInputMessage inputMessage)
            throws IOException, HttpMessageNotReadableException {

        JavaType javaType = getJavaType(type, contextClass);
        return readJavaType(javaType, inputMessage);
    }



    private Object readJavaType(JavaType javaType, HttpInputMessage inputMessage) throws IOException {

        InputStream in = inputMessage.getBody();
        JSONObject object = JSON.parseObject(in, fastJsonConfig.getCharset(), javaType, fastJsonConfig.getFeatures());
        return object.toJavaObject(javaType.getRawClass());
    }



}

增加处理器


import org.springframework.context.annotation.Configuration;
import org.springframework.http.converter.HttpMessageConverter;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurerAdapter;

import java.util.List;


/**
 *  InterceptorConfig
 * @author   qbk
 * @date     2019/11/10FastJsonHttpMessageConverter
 * @Param
 * @return
 * @see
 */
@Configuration
public class InterceptorConfig extends WebMvcConfigurerAdapter  {


    /**
     * 增加自定义处理器,处理数组跨域字符接收等
     * @Author: zhangjing
     * @Date: 2023/9/14 17:24
     * @param converters
     * @return void
     **/
    @Override
    public void configureMessageConverters(List<HttpMessageConverter<?>> converters) {
        converters.add(new MappingJackson2HttpMessageConverter2());
        super.configureMessageConverters(converters);
    }
}

到此解决

既能解决json接收问题,又能保证注解生效

自定义序列化

想自定义序列化,比如long超过17为转为字符串


import com.fasterxml.jackson.core.JsonGenerator;
import com.fasterxml.jackson.databind.*;
import com.fasterxml.jackson.databind.annotation.JacksonStdImpl;
import com.fasterxml.jackson.databind.jsonFormatVisitors.JsonFormatVisitable;
import com.fasterxml.jackson.databind.jsonFormatVisitors.JsonFormatVisitorWrapper;
import com.fasterxml.jackson.databind.jsonschema.SchemaAware;
import com.fasterxml.jackson.databind.jsontype.TypeSerializer;
import com.fasterxml.jackson.databind.ser.std.StdSerializer;
import com.fasterxml.jackson.databind.ser.std.ToStringSerializer;
import org.apache.poi.ss.formula.functions.T;

import java.io.IOException;
import java.lang.reflect.Type;

/**
 * @Author zhangjing
 * @Date 2023/9/15
 */
@JacksonStdImpl
@SuppressWarnings("serial")
public class LongToStringSerializer extends JsonSerializer<Object> {

    
    public LongToStringSerializer() {
        super();
    }


    @Override
    public void serialize(Object value, JsonGenerator gen, SerializerProvider provider)
            throws IOException
    {
        if(value!=null && value.toString().length()>17){
            gen.writeString(value.toString());
        }
        else {
            gen.writeNumber((long)value);
        }
    }
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值