当前位置: 首页 > wzjs >正文

舟山网大海网上海seo优化公司kinglink

舟山网大海网,上海seo优化公司kinglink,北京cbd网站建设公司,分类信息网站怎么建设问题背景 在 Spring Boot 项目中,我们经常需要自定义 HttpMessageConverter 来处理 JSON 序列化,比如将 Long 类型转换为 String 以避免前端 JavaScript 的精度丢失问题。然而,当我们直接覆盖默认的 MappingJackson2HttpMessageConverter 时…

问题背景

在 Spring Boot 项目中,我们经常需要自定义 HttpMessageConverter 来处理 JSON 序列化,比如将 Long 类型转换为 String 以避免前端 JavaScript 的精度丢失问题。然而,当我们直接覆盖默认的 MappingJackson2HttpMessageConverter 时,可能会导致 Swagger 文档无法正常访问,返回空白页面或 JSON 解析错误。

问题复现

以下是一个典型的自定义 HttpMessageConverter 配置:

@Override
public void configureMessageConverters(List<HttpMessageConverter<?>> converters) {MappingJackson2HttpMessageConverter jackson2HttpMessageConverter = new MappingJackson2HttpMessageConverter();ObjectMapper objectMapper = new ObjectMapper();SimpleModule simpleModule = new SimpleModule();simpleModule.addSerializer(BigInteger.class, ToStringSerializer.instance);simpleModule.addSerializer(Long.class, ToStringSerializer.instance);simpleModule.addSerializer(Long.TYPE, ToStringSerializer.instance);objectMapper.registerModule(simpleModule);objectMapper.disable(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES);jackson2HttpMessageConverter.setObjectMapper(objectMapper);converters.add(0, jackson2HttpMessageConverter); // 添加到首位
}

问题现象:

  • 访问 http://localhost:8080/swagger-ui.html 时,页面无法加载或显示异常。

  • 直接访问 http://localhost:8080/v3/api-docs/default 时,返回的 JSON 数据可能不符合 Swagger 的预期格式。

问题原因

  1. 覆盖默认转换器
    Spring Boot 默认会注册 MappingJackson2HttpMessageConverter,用于 JSON 序列化。当我们手动添加自定义转换器并放在首位(converters.add(0, ...)),会导致 Swagger 使用的默认转换器被跳过。

  2. ObjectMapper 配置冲突
    Swagger 依赖特定的 ObjectMapper 配置来生成 API 文档。如果我们修改了 ObjectMapper(如 Long 转 String),可能会破坏 Swagger 的 JSON 结构,导致文档无法正确渲染。

解决方案

方案 1:仅修改现有的 Jackson 转换器(推荐)

避免覆盖默认转换器,而是找到已存在的 MappingJackson2HttpMessageConverter 并修改其 ObjectMapper

@Override
public void configureMessageConverters(List<HttpMessageConverter<?>> converters) {for (HttpMessageConverter<?> converter : converters) {if (converter instanceof MappingJackson2HttpMessageConverter) {ObjectMapper objectMapper = ((MappingJackson2HttpMessageConverter) converter).getObjectMapper();configureObjectMapper(objectMapper);return;}}// 如果没找到,再添加新的转换器addNewJacksonConverter(converters);
}private void configureObjectMapper(ObjectMapper objectMapper) {SimpleModule module = new SimpleModule();module.addSerializer(BigInteger.class, ToStringSerializer.instance);module.addSerializer(Long.class, ToStringSerializer.instance);module.addSerializer(Long.TYPE, ToStringSerializer.instance);objectMapper.registerModule(module);objectMapper.disable(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES);
}private void addNewJacksonConverter(List<HttpMessageConverter<?>> converters) {MappingJackson2HttpMessageConverter converter = new MappingJackson2HttpMessageConverter();ObjectMapper objectMapper = new ObjectMapper();configureObjectMapper(objectMapper);converter.setObjectMapper(objectMapper);converters.add(converter);
}

方案 2:动态判断请求路径,Swagger 请求走默认转换器

如果必须添加新的 HttpMessageConverter,可以动态判断请求路径,让 Swagger 请求仍然使用默认转换器:

@Override
public void configureMessageConverters(List<HttpMessageConverter<?>> converters) {ObjectMapper customObjectMapper = new ObjectMapper();SimpleModule module = new SimpleModule();module.addSerializer(BigInteger.class, ToStringSerializer.instance);module.addSerializer(Long.class, ToStringSerializer.instance);module.addSerializer(Long.TYPE, ToStringSerializer.instance);customObjectMapper.registerModule(module);customObjectMapper.disable(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES);MappingJackson2HttpMessageConverter customConverter = new MappingJackson2HttpMessageConverter(customObjectMapper) {@Overridepublic boolean canWrite(Class<?> clazz, MediaType mediaType) {// 如果是 Swagger 请求,则不使用自定义转换器ServletRequestAttributes attrs = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();if (attrs != null) {String path = attrs.getRequest().getRequestURI();if (path.startsWith("/v3/api-docs") || path.startsWith("/swagger-ui")) {return false; // 让默认转换器处理}}return super.canWrite(clazz, mediaType);}};converters.add(0, customConverter);
}

方案对比

方案优点缺点
修改现有转换器兼容性最好,不影响 Swagger需要确保默认转换器存在
动态路径判断灵活控制不同请求的转换逻辑需要依赖 RequestContextHolder

总结

  • 推荐使用方案 1(修改现有转换器),因为它不会破坏 Spring Boot 的默认行为,兼容性更好。

  • 如果必须新增转换器,可以使用 方案 2(动态路径判断),确保 Swagger 仍然能正常工作。

  • 最终目标是 让 Swagger 使用默认的 ObjectMapper,而业务接口使用自定义的 JSON 序列化规则

这样,既能解决前端 Long 精度问题,又能保证 Swagger 文档正常访问! 🚀


📌 欢迎在评论区讨论你的解决方案!
🔗 相关技术:Spring Boot、Swagger、HttpMessageConverter、ObjectMapper

http://www.dtcms.com/wzjs/399738.html

相关文章:

  • 四川住房建设厅网站国内最开放的浏览器
  • 百度seo站长电商如何推广自己的产品
  • 常见c2c网站有哪些网络运营和网络营销的区别
  • 简易网站建设地产渠道12种拓客方式
  • 学校网站建立知名网页设计公司
  • javawebseo优化实训报告
  • 广告代理商是什么意思合肥seo搜索优化
  • 中线企业网站建设的问题2345浏览器网址
  • 大淘客怎样做网站网上卖产品怎么推广
  • 注册网站在哪里创建产品免费推广网站有哪些
  • 手机网站优化 工具郑州靠谱seo电话
  • 嘉祥县建设局官方网站网络营销环境
  • 武汉网站维护网站搭建
  • 深圳培训公司网站建设百度联盟官网
  • 天津 网站建设网络推广专员
  • 做网站想要个计算器功能网络营销应用方式
  • 企业网站建设网站腾讯广告官网
  • 网站域名后缀的意思站长统计免费下载
  • 怎样给网站做软件测试佛山做网络优化的公司
  • 怎么创建网站免费的今天《新闻联播》回放
  • 热门课程自己做网站百度推广seo怎么学
  • 东莞网上销售网站建设百青藤广告联盟
  • 小程序免费制作平台有赞江门seo推广公司
  • 免费行情软件网站下载无病毒百度推广渠道户
  • 怎么查网站的关键词深圳将进一步优化防控措施
  • 怎么在自己做的网站上发视频百度账号登录不了
  • 医院网站建设公司数字营销服务商seo
  • vps主机可以做几个网站合肥seo按天收费
  • 网站设计公司青岛在线crm网站
  • 网站建设合同注意事项seo全称英文怎么说