JSON 解析错误:无法构造 `java.util.LinkedHashMap` 的实例,没有从 String 反序列化的字符串参数方法 ('{"par1":"par2"}')]

问题描述 投票:0回答:1

我目前正在开发 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(错误请求)错误。

enter image description here

我想查看请求中发送的 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

enter image description here

ps。它以前工作过,自从我将参数字段类型从 String 更改为 Map 后,它就停止工作了。

java json spring-boot post jsonb
1个回答
0
投票

好吧,在调试了这个博客之后的请求后,发现参数是作为字符串发送的

"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>>() {}));
© www.soinside.com 2019 - 2024. All rights reserved.