spring boot使用@RequestBody无法接收含有List参数的对象,报错的解决办法

报错:com.fasterxml.jackson.databind.exc.InvalidDefinitionException: Cannot construct instance of `com.zongmao.school_v2.entity.Shop` (no Creators, like default constructor, exist): cannot deserialize from Object value (no delegate- or property-based Creator)
 at [Source: (PushbackInputStream); line: 1, column: 2]

定义的shop对象:

前端传的json数据:

后端接收接口:

此时就会报错,如果使用Map来接收参数,则可以正常的接收,但是使用map需要一个个的处理参数:

解决方法,在Shop实体类中必须添加空构造函数

在处理包含 `<` 或 `>` 符号的 JSON 数据时,Spring Boot 的 `@RequestBody` 注解可能会因为反序列化失败而报错。这种错误通常与 Jackson(Spring Boot 默认使用的 JSON 处理库)在解析特殊字符时的行为有关。以下是几种可能的原因和对应的解决方案: ### 1. 数据中包含未转义的 HTML 标签或特殊字符 如果 JSON 数据中包含类似 HTML 标签的内容,例如 `"description": "<p>用户信息</p>"`,Jackson 默认可能无法直接处理未转义的 `<` 和 `>` 符号。 **解决方案:** 确保在传输前对字符串中的特殊字符进行转义。例如,将 `<` 转义为 `\u003c`,将 `>` 转义为 `\u003e`。这样 Jackson 就能正确解析这些字符。 ```json { "description": "\\u003cp\\u003e用户信息\\u003c/p\\u003e" } ``` ### 2. 启用 Jackson 的 `JsonParser.Feature.ALLOW_UNQUOTED_CONTROL_CHARS` 默认情况下,Jackson 不允许未加引号的控制字符或某些特殊字符出现在 JSON 字符串中。如果数据中包含原始的 `<` 或 `>` 符号且无法转义,可以通过配置 Jackson 的 `ObjectMapper` 来允许这些字符。 **解决方案:** 在配置类中自定义 `ObjectMapper`,启用 `ALLOW_UNQUOTED_CONTROL_CHARS` 特性: ```java import com.fasterxml.jackson.core.JsonParser; import com.fasterxml.jackson.databind.ObjectMapper; import org.springframework.context.annotation.Configuration; import org.springframework.http.converter.HttpMessageConverter; import org.springframework.http.converter.json.MappingJackson2HttpMessageConverter; import org.springframework.web.servlet.config.annotation.WebMvcConfigurer; import java.util.List; @Configuration public class WebConfig implements WebMvcConfigurer { @Override public void configureMessageConverters(List<HttpMessageConverter<?>> converters) { ObjectMapper mapper = new ObjectMapper(); mapper.enable(JsonParser.Feature.ALLOW_UNQUOTED_CONTROL_CHARS); converters.add(new MappingJackson2HttpMessageConverter(mapper, MediaType.APPLICATION_JSON)); } } ``` 此配置允许 Jackson 解析包含未加引号的控制字符(如 `<` 和 `>`)的 JSON 数据 [^4]。 ### 3. 使用 `@JsonFormat` 或自定义反序列化器 如果某些字段需要保留原始格式(如富文本内容),可以考虑使用 `@JsonFormat` 注解配合自定义反序列化逻辑,或者直接在业务逻辑中对字段进行处理。 例如,使用 `@JsonFormat` 配合自定义解析: ```java public class UserRequest { @JsonFormat(using = CustomHtmlDeserializer.class) private String description; // Getter and Setter } ``` ### 4. 使用 `String` 类型接收并手动解析 如果数据结构较为复杂或无法确保数据格式的稳定性,可以考虑将整个 JSON 请求体作为 `String` 接收,然后手动解析: ```java @PostMapping public ResponseEntity<User> createUser(@RequestBody String rawJson) { ObjectMapper mapper = new ObjectMapper(); try { UserRequest userRequest = mapper.readValue(rawJson, UserRequest.class); // 继续处理逻辑 } catch (Exception e) { // 处理异常 } } ``` 这种方法提供了更大的灵活性,适用于需要对 JSON 数据进行预处理的场景 [^3]。 --- ###
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值