Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

FastJsonHttpMessageConverter自定义 Long类型的Deserializer不生效 #4479

Closed
arsenalzjx opened this issue Feb 3, 2024 · 1 comment
Closed

Comments

@arsenalzjx
Copy link

arsenalzjx commented Feb 3, 2024

场景是想自定义Long,Integer相关的反序列化,以便处理前端输入框中输入abc或者超长转换,导致FastJson直接抛出异常,所抛出异常中无法像Jackson等序列化工具,能够获取转换出错字段,原因等,因此无法给出相对友好提示

在配置中put相关Deserializer替换原有的Long.class和long.class,但无论如何,Long.class的字段反序列化都不会进入到我自定义的CustomeLongCodec中,long.class的情况是可以的,想寻求下如何能够自定义字段的反序列化规则,以下是相关配置代码,CustomeLongCodec只是继承了原有的LongCodec,Override 了deserialze方法

配置 自定义配置FastJsonHttpMessageConverter

@Bean
    public FastJsonHttpMessageConverter fastJsonHttpMessageConverter() {
        FastJsonHttpMessageConverter customFastJsonHttpMessageConverter = new FastJsonHttpMessageConverter();
        FastJsonConfig fastJsonConfig = new FastJsonConfig();
        ParserConfig parserConfig = new ParserConfig();
        ParserConfig globalInstance = ParserConfig.getGlobalInstance();
        parserConfig.putDeserializer(Long.class, CustomeLongCodec.instance);
        parserConfig.putDeserializer(long.class, CustomeLongCodec.instance);
//        parserConfig.putDeserializer(Integer.class, IntegerCodec.instance);
//        parserConfig.putDeserializer(int.class, IntegerCodec.instance);
        globalInstance.putDeserializer(Long.class, CustomeLongCodec.instance);
        globalInstance.putDeserializer(long.class, CustomeLongCodec.instance);
//        globalInstance.putDeserializer(Integer.class, IntegerCodec.instance);
//        globalInstance.putDeserializer(int.class, IntegerCodec.instance);

        fastJsonConfig.getSerializeConfig().put(Long.class, CustomeLongCodec.instance);
        SerializeConfig.getGlobalInstance().put(Long.class, CustomeLongCodec.instance);


        fastJsonConfig.setParserConfig(parserConfig);
        fastJsonConfig.setSerializerFeatures(
                SerializerFeature.WriteDateUseDateFormat,
                SerializerFeature.DisableCircularReferenceDetect);
        List<MediaType> mediaTypeList = new ArrayList<>();
        mediaTypeList.add(MediaType.APPLICATION_JSON);
        mediaTypeList.add(MediaType.APPLICATION_JSON_UTF8);
        customFastJsonHttpMessageConverter.setSupportedMediaTypes(mediaTypeList);
        customFastJsonHttpMessageConverter.setFastJsonConfig(fastJsonConfig);
        return customFastJsonHttpMessageConverter;
    }

配置webconfig

@Override
    public void configureMessageConverters(List<HttpMessageConverter<?>> converters) {
        converters.add(stringHttpMessageConverter());
//        converters.add(jackson2HttpMessageConverter());
        converters.add(fastJsonHttpMessageConverter());
        converters.add(xmlHttpMessageConverter());
        WebMvcConfigurer.super.configureMessageConverters(converters);
    }

Controller及Test类

 @PostMapping
    public CommonResult<Test> queryDate(@RequestBody Test test1) {
        return CommonResult.ok(test1);
    }

@Data
public class Test {

    private LocalDate localDate;

    private LocalDateTime createTime;

    private Date date;

    private Long longClassType;

    private long longType;

    private Integer integerType;

    private int intType;

    private String str;
}
@arsenalzjx arsenalzjx changed the title 自定义 Long类型的Deserializer不生效 自定义 Long类型的Deserializer不生效,版本1.2.83 Feb 3, 2024
@arsenalzjx arsenalzjx changed the title 自定义 Long类型的Deserializer不生效,版本1.2.83 FastJsonHttpMessageConverter自定义 Long类型的Deserializer不生效,版本1.2.83 Feb 3, 2024
@arsenalzjx
Copy link
Author

arsenalzjx commented Feb 4, 2024

用的1.2.29的版本号,升级到1.2.83看上去fieldName漏传,传了ParserConfig 依旧使用GlobalConfig的问题,以及配置了相关的Deserializer,但未生效的问题都解决了

@arsenalzjx arsenalzjx changed the title FastJsonHttpMessageConverter自定义 Long类型的Deserializer不生效,版本1.2.83 FastJsonHttpMessageConverter自定义 Long类型的Deserializer不生效 Feb 4, 2024
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

1 participant