【问题标题】:@RequestBody Object does not deserialize automatically@RequestBody 对象不会自动反序列化
【发布时间】:2018-09-24 16:00:44
【问题描述】:

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

在我的 RestController 中,我想自动反序列化一个对象(产品)。但是我得到一个 Jackson 错误,好像 ParameterNamesModule 没有注册一样。

原因: com.fasterxml.jackson.databind.exc.InvalidDefinitionException:不能 构造com.truc.Product 的实例(没有创建者,默认 构造,存在):不能从对象值反序列化(没有委托- 或基于财产的创作者)在[来源:未知;行:-1,列:-1] 在 com.fasterxml.jackson.databind.exc.InvalidDefinitionException.from(InvalidDefinitionException.java:67) 在 com.fasterxml.jackson.databind.DeserializationContext.reportBadDefinition(DeserializationContext.java:1451) 在 com.fasterxml.jackson.databind.DeserializationContext.handleMissingInstantiator(DeserializationContext.java:1027) 在 com.fasterxml.jackson.databind.deser.BeanDeserializerBase.deserializeFromObjectUsingNonDefault(BeanDeserializerBase.java:1290) 在 com.fasterxml.jackson.databind.deser.BeanDeserializer.deserializeFromObject(BeanDeserializer.java:326) 在 com.fasterxml.jackson.databind.deser.BeanDeserializer.deserialize(BeanDeserializer.java:159) 在 com.fasterxml.jackson.databind.ObjectReader._bind(ObjectReader.java:1574) 在 com.fasterxml.jackson.databind.ObjectReader.readValue(ObjectReader.java:965) 在 org.springframework.http.codec.json.AbstractJackson2Decoder.lambda$decodeInternal$0(AbstractJackson2Decoder.java:113) ... 省略了 287 个常用帧

我的 pom 中有jackson-module-parameter-names

 <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);
        }
    });
}

这是我的 Product.class

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-databind 2.9 之后不需要@JsonCreator,我使用jackson 2.9.5

如果我添加@JsonCreator,我会收到一个新错误415 Unsupported Content-Type 'application/json' ...

我不明白我错在哪里?

谢谢

【问题讨论】:

  • 看起来像没有默认构造函数错误。你也可以分享产品类吗?基本上你应该有一个默认构造函数或一个没有输入的构造函数,或者告诉杰克逊如何用@JsonCreator 实体构造实体
  • 当然,我用产品代码完成了这个问题。对于@JsonCreator,如果我添加它,我会收到一个新错误 415 Unsupported Content-Type 'application/json' 感谢您的回复

标签: java spring spring-mvc data-binding jackson


【解决方案1】:

你必须在你的 RequestBody 类中添加 默认构造函数,它是 ProductClass 然后它会工作

【讨论】:

    【解决方案2】:

    解释 here @EnableWebFlux 停用所有 webflux 自动配置。我在 Configuration 类中使用它,而不用 WebFluxConfigurer 扩展类。

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

    所以没关系 谢谢

    【讨论】:

      猜你喜欢
      • 2021-11-09
      • 2014-01-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-12-20
      • 1970-01-01
      • 2022-12-01
      • 2014-07-10
      相关资源
      最近更新 更多