至于WebMvcConfigurer 和 WebMvcConfigurationSupport对spring的重要性,网上有很多解释。后续再讲
这里只给解决方案:
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.SerializationFeature;
import com.fasterxml.jackson.datatype.jdk8.Jdk8Module;
import com.fasterxml.jackson.datatype.jsr310.JavaTimeModule;
import com.fasterxml.jackson.module.paramnames.ParameterNamesModule;
import com.yq.framework.web.interceptor.ContextInterceptor;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.http.converter.HttpMessageConverter;
import org.springframework.http.converter.StringHttpMessageConverter;
import org.springframework.web.servlet.config.annotation.CorsRegistry;
import org.springframework.web.servlet.config.annotation.EnableWebMvc;
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
import java.nio.charset.StandardCharsets;
import java.util.List;
@EnableWebMvc
@Configuration
public class WebConfigurer implements WebMvcConfigurer {
/**
* 乱码处理
*/
// @Bean
public HttpMessageConverter<String> responseBodyConverter() {
final StringHttpMessageConverter converter = new StringHttpMessageConverter(StandardCharsets.UTF_8);
converter.setWriteAcceptCharset(false);
return converter;
}
@Override
public void addCorsMappings(CorsRegistry registry) {
registry.addMapping("/**").allowedOrigins("*").allowedMethods("*").allowedHeaders("*");
}
@Override
public void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(new ContextInterceptor()).addPathPatterns("/**").excludePathPatterns("/favicon.ico");
}
@Bean(name = "mapperObject")
public ObjectMapper getObjectMapper() {
return new ObjectMapper().disable(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS)
.registerModule(new ParameterNamesModule())
.registerModule(new Jdk8Module())
.registerModule(new JavaTimeModule());
}
@Override
public void extendMessageConverters(List<HttpMessageConverter<?>> converters) {
if (converters.size() > 0) {
converters.add(converters.get(0));
converters.set(0, responseBodyConverter()); // 放到第一位
} else {
converters.add(responseBodyConverter());
}
}
}
重要是后面实现extendMessageConverters时,将消息解析器放在第一位。网上很多人写的都没有把这个实现,导致生成的bean其实不起作用。
PS: ContextInterceptor是我自定义的拦截器,可以替换成读者自己的。或者直接去掉,不影响问题的解决