项目场景:
接入JDK监控(prometheus)
接入后访问localhost:8080/prometheus发现可以正常吐出指标数据,但是会发现结果有\n 、"这类转义字符,不要以为没有什么影响,导致公司的监控中台没法识别,数据没法可视化查阅。
原因分析:
打断点进行分析的,由于过程有点过分复杂,就不贴图了,最终定位到是SpringMVC HttpMessageConverter的配置引起的;只配置了FastjsonHttpMessageConverter,把传入的字符串也当作Json进行解析,结果就是增加了不必要的转义字符;
FastJsonHttpMessageConverter 前面必须有一个StringHttpMessageConverter,converters里可以查看具体的顺序
解决方案:
配置文件形式(需要兼容之前的配置):
<mvc:annotation-driven>
<mvc:message-converters register-defaults="false">
<bean class="org.springframework.http.converter.StringHttpMessageConverter">
<property name="defaultCharset" value="UTF-8"/>
</bean>
<bean id="fastJsonHttpMessageConverter" class="com.alibaba.fastjson.support.spring.FastJsonHttpMessageConverter">
<property name="supportedMediaTypes">
<list>
<value>*/*</value>
</list>
</property>
</bean>
</mvc:message-converters>
</mvc:annotation-driven>
代码形式
@Configuration
public class WebConfigurer extends WebMvcConfigurerAdapter {
@Override
public void addInterceptors(InterceptorRegistry interceptorRegistry) {
interceptorRegistry.addInterceptor(new SignInterceptor()).addPathPatterns("/v1/**");
}
public HttpMessageConverter<String> stringConverter() {
StringHttpMessageConverter converter = new StringHttpMessageConverter(
Charset.forName("UTF-8"));
return converter;
}
public HttpMessageConverter fastConverter() {
//1、定义一个convert转换消息的对象
FastJsonHttpMessageConverter fastConverter = new FastJsonHttpMessageConverter();
//2、添加fastjson的配置信息
FastJsonConfig fastJsonConfig = new FastJsonConfig();
fastJsonConfig.setSerializerFeatures(SerializerFeature.PrettyFormat);
fastJsonConfig.setCharset(Charset.forName("UTF-8"));
//2-1 处理中文乱码问题
List<MediaType> fastMediaTypes = new ArrayList<>();
fastMediaTypes.add(MediaType.APPLICATION_JSON_UTF8);
fastConverter.setSupportedMediaTypes(fastMediaTypes);
//3、在convert中添加配置信息
fastConverter.setFastJsonConfig(fastJsonConfig);
return fastConverter;
}
@Override
public void extendMessageConverters(List<HttpMessageConverter<?>> converters) {
converters.clear();
converters.add(stringConverter());
converters.add(fastConverter());
}
}