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.