JSON 解析错误:无法反序列化类型为"java.util.LinkedHashMap<java.lang.String,java.lang.Double>的值



显然我有一个反序列化问题。我想在数据库中插入一个新产品列表。一开始我遇到了这样的问题:

"trace": "org.springframework.http.converter.HttpMessageNotReadableException: JSON parse error: Cannot deserialize value of type 
`java.util.ArrayList<com.example.resources.entities.Product>` from Object value (token `JsonToken.START_OBJECT`); 

所以我创建了一个包装器"ProductWrapper">

@Getter
@Setter
public class ProductWrapper implements Serializable {
private static final long serialVersionUID = 1L;
List<Product> products;   
}

第一个问题解决了,但我还有一个问题无法解决。我在列表中使用了map。

"timestamp": "2022-11-14T10:45:18.453+00:00",
"status": 400,
"error": "Bad Request",
"trace": "org.springframework.http.converter.HttpMessageNotReadableException: JSON parse error: Cannot deserialize value of type `java.util.LinkedHashMap<java.lang.String,java.lang.Double>` from Array value (token `JsonToken.START_ARRAY`); nested exception is com.fasterxml.jackson.databind.exc.MismatchedInputException: Cannot deserialize value of type `java.util.LinkedHashMap<java.lang.String,java.lang.Double>` from Array value (token `JsonToken.START_ARRAY`)n at [Source: (org.springframework.util.StreamUtils$NonClosingInputStream); line: 7, column: 27] (through reference chain: com.example.resources.dto.ProductWrapperDTO["products"]->java.util.ArrayList[0]->com.example.resources.entities.Product["dimensions"])rntat org.springframework.http.converter.json.AbstractJackson2HttpMessageConverter.readJavaType(AbstractJackson2HttpMessageConverter.java:391)rntat org.springframework.http.converter.json.AbstractJackson2HttpMessageConverter.read(AbstractJackson2HttpMessageConverter.java:343)rntat org.springframework.web.servlet.mvc.method.annotation.AbstractMessageConverterMethodArgumentResolver.readWithMessageConverters(AbstractMessageConverterMethodArgumentResolver.java:185)rntat org.springframework.web.servlet.mvc.method.annotation.RequestResponseBodyMethodProcessor.readWithMessageConverters(RequestResponseBodyMethodProcessor.java:160)rntat org.springframework.web.servlet.mvc.method.annotation.RequestResponseBodyMethodProcessor.resolveArgument(RequestResponseBodyMethodProcessor.java:133)rntat org.springframework.web.method.support.HandlerMethodArgumentResolverComposite.resolveArgument(HandlerMethodArgumentResolverComposite.java:122)rntat org.springframework.web.method.support.InvocableHandlerMethod.getMethodArgumentValues(InvocableHandlerMethod.java:179)rntat org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:146)rntat org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:117)rntat org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandlerMethod(RequestMappingHandlerAdapter.java:895)rntat org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:808)rntat org.springframework.web.servlet.mvc.method.
@Entity
@Data
@NoArgsConstructor @AllArgsConstructor
@TypeDefs({@TypeDef(name = "jsonb", typeClass = JsonBinaryType.class)})
public class Product {
@Id
private String productCode;
private String name;
private float pricePerUnit;
@Type(type="jsonb")
@Column(columnDefinition = "jsonb")
private Map<String, Double> dimensions = new HashMap<>(); 
}
@RestController
@RequestMapping("/products")
@RequiredArgsConstructor
public class ProductController {
private ProductService productService;

@PostMapping
public void addProducts(@Valid @RequestBody ProductWrapper products) {
productService.addProducts(products.getProducts());
}
}
public class ProductServiceImpl implements ProductService {

private ProductRepository productRepository;
@Override
public void addProducts(List<Product> products) {
for (Product product : products) {
productRepository.save(product);
}   
}
}

这是我的请求正文,post in postman:

{
"products": [
{
"productCode": "P100",
"name": "produit 1",
"pricePerUnit": "250.99",
"dimensions": [
{
"productHeight": "55",
"productWeight": "20"
}
]
},
{
"productCode": "P101",
"name": "produit 2",
"pricePerUnit": "250.99",
"dimensions": [
{
"productHeight": "60",
"productWeight": "15"
}
]
}
]
}

提前感谢您的帮助

您遇到了这个问题,因为dimensions不能反序列化为映射。基于你发送的json的默认值是一个自定义类型的List(带有属性:

)
"productHeight": "",
"productWeight": ""

作为成员变量)。因此,请考虑定义自定义类型并将其作为List存储在实体中。

否则,如果你真的想使用一个映射,看看这个定义自定义反序列化器。

相关内容

最新更新