当前位置: 首页 > 知识库问答 >
问题:

@RequestBody对象不会自动反序列化

闾丘正志
2023-03-14

我使用带有WebFlux的Spring boot 2.0.1作为Rest服务器。

在我RestController我想自动反序列化一个对象(产品)。但是我得到一个杰克逊错误,好像参数名称模块没有注册。

原因:com.fasterxml.jackson.databind.exc.Invalid定义异常:无法构建com.truc.产品的实例(没有像默认构造一样的Creator):无法从对象值(没有基于委托或属性的Creator)反序列化[Source: UNKNOWN; line:-1,列:-1]在com.fasterxml.jackson.databind.exc.Invalid定义xception.from(Invalid定义xception.java:67)在com.fasterxml.jackson.databind.DeseriazationContext.reportBad定义(DeseriazationContext.java:1451)在com.fasterxml.jackson.databind.DeseriazationContext.handleMisSingInstantiator(com.fasterxml.jackson.databind.deser.BeanDeseriazerBase.deserializeFromObjectUSingNonDefault(BeanDeseriazerBase.java:1290)com.fasterxml.jackson.databind.deser.BeanDeserializer.deserializeFromObject(BeanDeserializer.java:326)com.fasterxml.jackson.databind.deser.BeanDeserializer.deserialize(BeanDeserializer.java:159)在com. faerxml. jackson.数据库。ObjectReader._bind(ObjectReader. java: 1574),网址为com. fast erxml. jackson.数据库。ObjectReader. readValue(ObjectReader. java: 965)在org. springframework. http. codec. json。AbstractJackson2Decoder. lambda$decdeInternal0美元(AbstractJackson2Decoder. java: 113)...省略了287个常见帧

我的pom中有jackson模块参数名

 <dependency>
     <groupId>com.fasterxml.jackson.module</groupId>
     <artifactId>jackson-module-parameter-names</artifactId>
 </dependency>

这是RestController中的路径

@ResponseStatus(HttpStatus.CREATED)
@RequestMapping(method = RequestMethod.POST)
public Mono<Entity<Product>> postProduct(@RequestBody Product product) {
    return productService.insert(product);
}

如果我尝试手动反序列化,它会起作用:

@Autowired
private ObjectMapper objectMapper;
...
@ResponseStatus(HttpStatus.CREATED)
@RequestMapping(method = RequestMethod.POST)
public Mono<Entity<Product>> postProduct(ServerWebExchange exchange) {
    return exchange.getRequest().getBody()
            .last().flatMap(buffer -> {
        try {
            Product product = objectMapper.readValue(buffer.asInputStream(), Product.class);
            return productService.insert(product);
        } catch (IOException e) {
            throw new RuntimeException(e);
        }
    });
}

这是我的产品。班

package com.truc;

import java.time.LocalDate; import java.util.Optional;

public final class Product {
    public static final String PREFIX = "PT";

    public final String description;
    public final String shortDescription;
    public final String sku;
    public final float weight;
    public final LocalDate newSince;
    public final LocalDate newUntil;
    public final Status status;
    public final Visibility visibility;
    public final String metaKeywords;

    public Product(String description, String shortDescription, String sku, Float weight,
                   LocalDate newSince, LocalDate newUntil, Status status, Visibility visibility, String metaKeywords) {
        this.description = description;
        this.shortDescription = shortDescription;
        this.sku = sku;
        this.weight = Optional.ofNullable(weight).orElse(0f);
        this.newSince = newSince;
        this.newUntil = newUntil;
        this.status = status;
        this.visibility = visibility;
        this.metaKeywords = metaKeywords;
    }

    public enum Status {
        ACTIVE, INACTIVE
    }

    public enum Visibility {
        FULL, CATALOG, SEARCH, NONE
    } 
}

如果我明白了jackson-数据库2.9之后不需要@JsonCreator,我使用jackson2.9.5

如果我添加@JsonCreator我得到一个新的错误415不支持的内容类型'应用程序/json'...

我不明白我错在哪里?

谢啦

共有2个答案

欧阳晗日
2023-03-14

正如这里解释的那样,@EnableWebFlux停用所有webflux自动配置。我在配置类中使用它,而不使用webfluxconfig扩展类。

当我删除@EnableWebFlux它再次工作时,ObjectMapper按预期配置

没关系,谢谢

邵弘伟
2023-03-14

您必须在RequestBody类中添加默认构造函数,即ProductClass,然后它才能工作

 类似资料:
  • 问题内容: 我正在寻找一种在Swift中自动序列化和反序列化类实例的方法。假设我们定义了以下类…… …和实例: 的JSON表示形式如下: 现在,这是我的问题: 我如何序列化实例并获取上面的JSON,而不必手动将类的所有属性添加到变成JSON的字典中? 我如何反序列化上面的JSON并获取静态类型为类型的实例化对象?同样,我不想手动映射属性。 这是使用Json.NET在C#中执行此操作的方法: 问题答

  • 问题内容: 确定,所以我编辑了问题,因为它不够清楚。 编辑2 :更新了JSON文件。 我在Android应用程序中使用GSON,我需要解析来自服务器的JSON文件,这些文件有点太复杂了。我不想让我的对象结构太沉重,所以我想简化内容: 所以我的对象的结构将不是JSON文件的结构。 例如,如果在JSON中,我有以下内容: 我不想保留我当前的对象结构,即一个对象,其中包含一个和一个“总计”。但是我只想将

  • 我有下面的JSON,我正试图使用Jackson API反序列化它 我基本上需要一个附件类,它有一个AttachmentFile对象列表,如下所示: 如何使用自定义反序列化器实现这一点? 谢谢

  • 我该怎么做才能使这件事如我所愿?。谢谢 JSON对象示例列表 示例JSON对象: null 忽略不存在json字段的反序列化错误,但问题仍然存在。 示例:对象反序列化器

  • 我有这个枚举: 控制器中的此方法: 在客户端,我使用angularJS使用http服务使用上述方法,如下所示: 但我在服务器中遇到此异常: .w.s.m.s.DefaultHandlerExceptionResolver:无法读取HTTP消息:org。springframework。http。转换器。HttpMessageTreadableException:无法读取文档:无法反序列化模型实例。乌

  • 如何基于json中指定的类类型,在Jackson中实现从json到Java对象的转换。 Java类型示例: