我目前正在开发 Spring Boot 电子商务后端和 Angular 前端。这是确切的错误消息:
2024-11-22T15:47:36.290+01:00 WARN 12532 --- [nio-8080-exec-4] .w.s.m.s.DefaultHandlerExceptionResolver : Resolved [org.springframework.http.converter.HttpMessageNotReadableException: JSON parse error: Cannot construct instance of `java.util.LinkedHashMap` (although at least one Creator exists): no String-argument constructor/factory method to deserialize from String value ('{"par1":"par2"}')]
当我尝试使用字段类型为
Map<String, String>
的参数向商店添加新项目时,会发生错误,这是反序列化错误的。我所得到的只是这个 400(错误请求)错误。
我想查看请求中发送的 JSON,但我无法在控制台中记录从服务到控制器级别的任何内容。
@RequestMapping(method = RequestMethod.POST)
public ResponseEntity<Response> save(@RequestBody ProductFormDTO productFormDTO) {
System.out.println("Received ProductFormDTO: " + productFormDTO);
return productMediator.saveProduct(productFormDTO);
}
该方法似乎停在方法的第一行,甚至没有进行到打印行。
在
ProductEntity
中,参数字段定义如下:
@Column(columnDefinition = "jsonb")
private Map<String, String> parameters;
productDTO 和 ProductFormDTO 相同
private Map<String, String> parameters;
下面我展示了我在 mediator 中的 saveProduct 方法:
public ResponseEntity<Response> saveProduct(ProductFormDTO productFormDTO) {
try{
ProductEntity product = formToProductEntity.toProductEntity(productFormDTO);
categoryService.findCategoryByShortID(product.getCategory().getShortId()).ifPresentOrElse(product::setCategory,()->{
throw new CategoryDontExistException();
});
productService.createProduct(product);
return ResponseEntity.ok(new Response("Successful created a product"));
}catch (RuntimeException e){
e.printStackTrace();
return ResponseEntity.status(400).body(new Response("Can't create product category don't exist"));
}
}
和服务:
@Transactional
public void createProduct(ProductEntity product) {
logger.info("Creating product with details: {}", product);
if (product != null) {
product.setCreateAt(LocalDate.now());
product.setUid(UUID.randomUUID().toString());
product.setActivate(true);
productRepository.save(product);
for (String uuid : product.getImageUrls()) {
activateImage(uuid);
}
logger.info("Product created successfully with UID: {}", product.getUid());
return;
}
throw new RuntimeException("Product is null, cannot create.");
}
记录器无法工作。
您知道问题是什么,或者知道如何查看请求中发送的确切 JSON 吗?它可能有一些错误的格式。我尝试了
RequestLoggingFilter
与 @WebFilter("/*")
,但它不起作用,我的控制台中没有任何内容。
我也确信数据库中的字段参数已正确设置为
jsonb
中的PostgreSQL
。
ps。它以前工作过,自从我将参数字段类型从 String 更改为 Map 后,它就停止工作了。
好吧,在调试了这个博客之后的请求后,发现参数是作为字符串发送的
"parameters":"{\"par1\":\"par2\"}"
与jsonb
格式不匹配。
我刚刚将
ProductFormDTO
中的参数声明从更改为
private Map<String, String> parameters;
到
private String parameters;
并使用
ProductFormToProductEntity
映射器中的 ObjectMapper 对其进行反序列化
ObjectMapper objectMapper = new ObjectMapper();
productEntity.setParameters(objectMapper.readValue(productFormDTO.getParameters(), new TypeReference<Map<String, String>>() {}));