fix(core): avoid replacing projecting jackson converter

This commit is contained in:
PIGCLOUD committed 2026-06-18 22:51:49 +08:00
1 parent a6af889ccf
commit bdeba4ce3d
1 file changed
+11 -3
@@ -82,6 +82,7 @@ public class JacksonConfiguration implements WebMvcConfigurer {
* <li>yyyy-MM-dd -> LocalDate</li>
* <li>yyyy-MM-dd HH:mm:ss -> LocalDateTime</li>
* </ul>
*
* @param registry
*/
@Override
@@ -95,6 +96,7 @@ public class JacksonConfiguration implements WebMvcConfigurer {
/**
* 避免form 提交 context-type 不规范中文乱码
*
* @return Filter
*/
@Bean
@@ -119,14 +121,19 @@ public class JacksonConfiguration implements WebMvcConfigurer {
* 替换策略:用 {@link ListIterator#set} 原地替换 Jackson 3 converter;找不到时把 Jackson 2
* converter 插到队首作为 fallback。不做 clear,以免破坏 byte[]、String、multipart
* 等其它默认 converter。
*
* @param converters 消息转换器列表
*/
@Override
public void extendMessageConverters(List<HttpMessageConverter<?>> converters) {
ObjectMapper objectMapper = objectMapperProvider.getIfAvailable();
if (objectMapper == null) {
log.warn("ObjectMapper 不可用,跳过 Spring MVC Jackson 2 替换;保留 Spring Boot 默认 converter 链。");
return;
// 本类存在的唯一目的就是把 MVC 链路桥接回 Jackson 2,拿不到 Jackson 2 ObjectMapper
// 说明 jackson2 autoconfigure 未生效,属于环境配置错误。若静默降级到 Jackson 3,
// pigx-common-xss 的反序列化 XSS 清洗、Long->String、时间格式都会失效且难以察觉,
// 因此在启动期 fail-fast 暴露,而不是带病运行。
throw new IllegalStateException("Jackson 2 ObjectMapper 不可用,无法将 Spring MVC 桥接到 Jackson 2;"
+ "请检查 jackson2 autoconfigure 是否生效(XSS 清洗、Long 字符串化、时间格式均依赖于此)。");
}
org.springframework.http.converter.json.MappingJackson2HttpMessageConverter jackson2Converter =
@@ -134,9 +141,10 @@ public class JacksonConfiguration implements WebMvcConfigurer {
ListIterator<HttpMessageConverter<?>> it = converters.listIterator();
boolean replaced = false;
while (it.hasNext()) {
if (it.next() instanceof JacksonJsonHttpMessageConverter) {
if (it.next().getClass() == JacksonJsonHttpMessageConverter.class) {
it.set(jackson2Converter);
replaced = true;
break;
}
}
if (!replaced) {