El cierre de swagger2 provoca una excepción de interfaz No se ha encontrado ningún convertidor para el valor de retorno del tipo ...

anormal

Escenario: cierre swagger2 cuando un proyecto con una interfaz normal se conecte.

Problema: la interfaz que usa una clase de entidad personalizada para devolver datos tendrá la siguiente excepción:

Análisis de causa

Configuración del proyecto

Existe una clase de configuración de este tipo en el proyecto:

class MyWebConfig extends WebMvcConfigurationSupport

El siguiente código en la clase:

    @Override
    public void configureMessageConverters(List<HttpMessageConverter<?>> converters) {
        super.configureMessageConverters(converters);
        //解决中文乱码
        StringHttpMessageConverter stringHttpMessageConverter = new StringHttpMessageConverter(Charset.forName("UTF-8"));
        //添加 stringHttpMessageConverter
        converters.add(stringHttpMessageConverter);
    }

La intención original de esta configuración es resolver el problema de los caracteres confusos chinos en la interfaz que devuelve directamente String (la codificación predeterminada de StringHttpMessageConverter es ISO-8859-1)

El meollo del problema radica en este método de reescritura.

 

¿Por qué swagger2 es normal cuando está encendido?

La interfaz era normal antes de que se cerrara swagger2 porque swagger procesaba los convertidores y la interfaz era normal.

Después de cerrar swagger2, el método configureMessageConverters hará que las conversiones predeterminadas no se inicialicen.

Nota: No hay un análisis aquí sobre cómo se procesa la arrogancia.

 

Análisis de código fuente a través de WebMvcConfigurationSupport

Fragmentos de código en la clase WebMvcConfigurationSupport:

protected final List<HttpMessageConverter<?>> getMessageConverters() {
        if (this.messageConverters == null) {
            this.messageConverters = new ArrayList();
            this.configureMessageConverters(this.messageConverters);
            if (this.messageConverters.isEmpty()) {
                this.addDefaultHttpMessageConverters(this.messageConverters);
            }

            this.extendMessageConverters(this.messageConverters);
        }

        return this.messageConverters;
    }

El método configureMessageConverters se reescribe en el proyecto y addconverters provocará

El método This.ddDefaultHttpMessageConverters (this.messageConverters) no se ejecuta.

Como resultado, las conversiones predeterminadas no se pueden agregar a messageConverters, que es la causa de la excepción.

Solución

Comente el código que reescribe configureMessageConverters

Anular método extendMessageConverters

protected void extendMessageConverters(List<HttpMessageConverter<?>> converters) {
    }

 Cambiar la codificación predeterminada de StringHttpMessageConverter

    @Override
    protected void extendMessageConverters(List<HttpMessageConverter<?>> converters) {
        super.extendMessageConverters(converters);
        for (HttpMessageConverter<?> converter : converters) {
            if (converter instanceof StringHttpMessageConverter) {
                StringHttpMessageConverter stringHttpMessageConverter = (StringHttpMessageConverter) converter;
                stringHttpMessageConverter.setDefaultCharset(StandardCharsets.UTF_8);
            }
        }
    }

Después de esta modificación, no hay ningún problema confuso al devolver String Chinese, y la interfaz de la entidad que regresa también es normal.

Supongo que te gusta

Origin blog.csdn.net/cs373616511/article/details/105832543
Recomendado
Clasificación