springboot配置统一异常处理后可以捕获异常信息,无法返回自定义的异常数据

在使用springboot配置了统一异常处理,也可以捕获到异常信息,但是就是返回的数据还是老样子

这里写图片描述

这里写图片描述

关键错误信息:

Failed to invoke @ExceptionHandler method: public

org.springframework.web.HttpMediaTypeNotAcceptableException: Could not find acceptable representation

最后发现原来是我引入fastjson没有配置HttpMessageConverters引起的

配置一下就可以了

    @Bean
    public HttpMessageConverters fastJsonHttpMessageConverters() {
        // 1. 需要定义一个Convert转换消息的对象
        FastJsonHttpMessageConverter fastConverter = new FastJsonHttpMessageConverter();
        // 2.添加fastjson的配置信息,比如是否要格式化返回的json数据
        FastJsonConfig fastJsonConfig = new FastJsonConfig();
        fastJsonConfig.setDateFormat(Consts.DATE_FORMAT);
        fastJsonConfig.setSerializerFeatures(
                SerializerFeature.PrettyFormat,
                SerializerFeature.WriteNullStringAsEmpty,
                SerializerFeature.WriteNullListAsEmpty,
                SerializerFeature.MapSortField,
                // 循环引用
                SerializerFeature.DisableCircularReferenceDetect);
        // 3.在convert中添加配置信息
        fastConverter.setFastJsonConfig(fastJsonConfig);
        HttpMessageConverter<?> converter = fastConverter;
        return new HttpMessageConverters(converter);
    }

配置后的错误信息

这里写图片描述

这个问题修复后又出现了一个新问题:项目中使用ResponseEntity返回流的接口都会报错

org.springframework.http.converter.HttpMessageNotWritableException: Could not write JSON: write javaBean error, fastjson version 1.2.49, class org.springframework.core.io.InputStreamResource

这是fastjson的一个bug,参考https://github.com/alibaba/fastjson/issues/1701

最后我把HttpMessageConverters改为MappingJackson2HttpMessageConverter两个问题都解决

    @Bean
    @Primary
    public HttpMessageConverters jacksonHttpMessageConverters() {
        MappingJackson2HttpMessageConverter converter = new MappingJackson2HttpMessageConverter();
        converter.setSupportedMediaTypes(getSupportedMediaTypes());
        converter.setDefaultCharset(Charset.forName("UTF-8"));
        return new HttpMessageConverters(converter);
    }

    @Bean
    public HttpMessageConverters fastJsonHttpMessageConverters() {
        FastJsonHttpMessageConverter converter = new FastJsonHttpMessageConverter();
        FastJsonConfig fastJsonConfig = new FastJsonConfig();
        fastJsonConfig.setSerializerFeatures(
                SerializerFeature.PrettyFormat,
                SerializerFeature.WriteNullStringAsEmpty,
                SerializerFeature.WriteNullListAsEmpty,
                // 循环引用
                SerializerFeature.DisableCircularReferenceDetect);
        converter.setFastJsonConfig(fastJsonConfig);
        converter.setSupportedMediaTypes(getSupportedMediaTypes());
        return new HttpMessageConverters(converter);
    }

    private List<MediaType> getSupportedMediaTypes() {
        List<MediaType> mediaTypes = new ArrayList<>();
        mediaTypes.add(MediaType.ALL);
//        mediaTypes.add(MediaType.APPLICATION_ATOM_XML);
//        mediaTypes.add(MediaType.APPLICATION_FORM_URLENCODED);
//        mediaTypes.add(MediaType.APPLICATION_JSON);
//        mediaTypes.add(MediaType.APPLICATION_JSON_UTF8);
//        mediaTypes.add(MediaType.APPLICATION_OCTET_STREAM);
//        mediaTypes.add(MediaType.APPLICATION_PDF);
//        mediaTypes.add(MediaType.APPLICATION_RSS_XML);
//        mediaTypes.add(MediaType.APPLICATION_XHTML_XML);
//        mediaTypes.add(MediaType.APPLICATION_XML);
//        mediaTypes.add(MediaType.IMAGE_GIF);
//        mediaTypes.add(MediaType.IMAGE_JPEG);
//        mediaTypes.add(MediaType.IMAGE_PNG);
//        mediaTypes.add(MediaType.MULTIPART_FORM_DATA);
//        mediaTypes.add(MediaType.TEXT_EVENT_STREAM);
//        mediaTypes.add(MediaType.TEXT_HTML);
//        mediaTypes.add(MediaType.TEXT_MARKDOWN);
//        mediaTypes.add(MediaType.TEXT_PLAIN);
//        mediaTypes.add(MediaType.TEXT_XML);
        return mediaTypes;
    }

猜你喜欢

转载自blog.csdn.net/frankcheng5143/article/details/81743593