在用map接受前端数据时,转换为Long类型报错解决办法

博客主要讲述Java中前端数据格式转换的问题。前端数据为json格式,当本地接收类型与前端传输类型不一致,如前端传Integer本地需Long时,直接显示声明会报错。之后又考虑前端传字符串的情况,最终选择全转换成字符串再转对应类型来解决。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

前端数据是使用的json格式
因为一个map需要接收多种类型的数据
所以使用的是

@RequestBody Map<String, Object> param

当前端数据传输为Integer类型而本地需要接收的类型为Long
最初尝试直接使用(Long)显示声明(不管是不是封装类)
但是仍然会报错

java.lang.Integer cannot be cast to java.lang.Long

解决办法:

//param为接收参数用的map
Long.valueOf((int) param.get("userId"))

但是啊,后来又遇到问题了,前端传的是字符串怎么办啊
单独写个对字符串的判断吗?
程序员都是懒人,我格外懒,我选择
全转换成字符串,然后转换为对应类型

@Bean public HttpMessageConverters fastJsonHttpMessageConverters() { // 创建一个FastJsonHttpMessageConverter实例,用于JSON数据转换 FastJsonHttpMessageConverter fastConverter = new FastJsonHttpMessageConverter(); // 创建并配置一个FastJsonConfig实例,用于定制JSON数据的处理规则 FastJsonConfig fastJsonConfig = new FastJsonConfig(); // 设置JSON数据的序列化特性,此处为格式化输出,提高可读性 fastJsonConfig.setSerializerFeatures(SerializerFeature.PrettyFormat); // 获取全局的序列化配置实例 SerializeConfig serializeConfig = SerializeConfig.globalInstance; // 将BigInteger、Long转为String类型 serializeConfig.put(BigInteger.class, ToStringSerializer.instance); serializeConfig.put(Long.class, ToStringSerializer.instance); serializeConfig.put(Long.TYPE, ToStringSerializer.instance); // 配置LocalDateTime类型数据转换为字符串类型,以适应JSON格式 serializeConfig.put(LocalDateTime.class, ToStringSerializer.instance); // 将自定义的序列化配置应用到FastJsonConfig中 fastJsonConfig.setSerializeConfig(serializeConfig); // 将配置好的FastJsonConfig应用到FastJsonHttpMessageConverter中 fastConverter.setFastJsonConfig(fastJsonConfig); // 返回包含配置好的FastJsonHttpMessageConverter的HttpMessageConverters return new HttpMessageConverters(fastConverter); }为什么我不配置以上的消息转换 @PostMapping("test") public void test(@RequestBody Map deviceReported){ System.out.println("map = " + deviceReported); }这个接口调用会出现2025-03-29 18:07:30.897 WARN 17460 --- [ XNIO-1 task-1] .w.s.m.s.DefaultHandlerExceptionResolver : Resolved [org.springframework.web.HttpMediaTypeNotSupportedException: Content type 'application/json;charset=UTF-8' not supported] 2025-03-29 18:07:30.905 WARN 17460 --- [ XNIO-1 task-1] .w.s.m.s.DefaultHandlerExceptionResolver : Resolved [org.springframework.http.converter.HttpMessageNotWritableException: No converter found for return value of type: class java.util.LinkedHashMap]这个问题
最新发布
03-30
从您提供的信息来看,`@Bean public HttpMessageConverters fastJsonHttpMessageConverters()` 这段代码的主要作用是配置 `FastJsonHttpMessageConverter` 消息转换器,并将其注册为 Spring Boot 的 HTTP 消息转换器之一。如果没有正确配置消息转换器,则可能导致某些类型的 JSON 数据无法正常解析。 以下是详细分析以及解决方案: --- ### 原因分析 当您调用接口 `/test` 并传递 JSON 格式的数据,默认情况下,Spring MVC 使用内置的消息转换器(如 Jackson 提供的 `MappingJackson2HttpMessageConverter`)来处理请求体和响应体的内容。如果未显式地配置其他消息转换器(例如 `FastJsonHttpMessageConverter`),并且您的项目依赖了多种 JSON 序列化库(比如同引入了 Jackson 和 Fastjson),可能会导致以下问题: 1. **默认内容协商失败** 如果没有将正确的 `HttpMessageConverter` 注册到 Spring 容器中,Spring 可能找不到支持指定 MIME 类型(如 `application/json;charset=UTF-8`)的转换器,进而抛出类似 `HttpMediaTypeNotSupportedException` 或 `HttpMessageNotReadableException` 的异常。 2. **日期等复杂类型序列化问题** 默认的 Jackson 转换器可能对一些特殊数据类型(如 `LocalDateTime`、`BigInteger` 等)缺乏定制化的序列化规则,而您通过上述代码手动设置了 Fastjson 对于这些类型的序列化方式。如果不配置此部分逻辑,就会引发诸如间戳格式错误等问题。 3. **返回值不可写入的问题** 接口返回的对象如果是复杂的集合类(如 `LinkedHashMap`),需要相应的消息转换器能够识别并正确序列化成 JSON 字符串;若缺少合适的转换工具链则会触发 `HttpMessageNotWritableException` 异常提示“未能找到针对特定返回类型的有效转换器”。 --- ### 解决方案 为了确保程序运行稳定可靠,请按照实际需求完成以下几个步骤操作: #### 方案一:启用自定义的 Fastjson 转换器 如果您确实希望使用 Fastjson 来替代 Jackson 成为主流的消息转换机制,那么可以参考下面的做法进一步完善 Bean 配置过程: ```java @Bean public HttpMessageConverters fastJsonHttpMessageConverters() { FastJsonHttpMessageConverter converter = new FastJsonHttpMessageConverter(); // 自定义全局 SerializerConfig 实例 SerializeConfig config = SerializeConfig.globalInstance; // 添加 BigInteger 和 Long 类型映射至 String 输出形式 config.configProperty(PropertyNamingStrategy.SnakeCase); // 支持下划线命名风格 config.put(BigInteger.class, ToStringSerializer.instance); config.put(Long.class, ToStringSerializer.instance); config.put(LocalDateTime.class, LocalDateTimeSerializer.instance); // 初始化基础配置项 FastJsonConfig fastJsonConfig = new FastJsonConfig(); fastJsonConfig.setDateFormat("yyyy-MM-dd HH:mm:ss"); fastJsonConfig.setSerializerFeatures( SerializerFeature.WriteMapNullValue, SerializerFeature.PrettyFormat, SerializerFeature.DisableCircularReferenceDetect ); fastJsonConfig.setSerializeFilters(new ValueFilter() { /* ... */ }); fastJsonConfig.setSerializeConfig(config); // 绑定配置给 Converter converter.setFastJsonConfig(fastJsonConfig); return new HttpMessageConverters(converter); } ``` 然后确认已经在项目的主启动类上添加注解 `@EnableWebMvc` 才能使该 Bean 生效覆盖原有设置。 --- #### 方案二:保持原样但调整输入输出结构适配 Jackson 假如不想完全切换回 Fastjson,也可以尝试直接修改实体模型或者前端发送过来的数据包以满足 Jackson 默认约定条件下的解析能力即可解决冲突情况的发生几率减少很多哦~ 对于示例中的测试 API 方法来说只要保证传参符合标准规范就不会报错了~ --- ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值