首页 文章

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

提问于
浏览
1

我使用Spring-boot 2.0.1和WebFlux作为Rest服务器 .

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

引起:com.fasterxml.jackson.databind.exc.InvalidDefinitionException:无法构造com.truc.Product的实例(没有Creator,如默认构造,存在):无法从Object值反序列化(没有基于委托或属性的Creator )来源:UNKNOWN;在com.fasterxml.jackson.databind.exc.InvalidDefinitionException.from(InvalidDefinitionException.java:67)的com.fasterxml.jackson.databind.DeserializationContext.reportBadDefinition(DeserializationContext.java:1451)中的行:-1,列:-1]在com.fasterxml.jackson.dacheson.jackson.jackson.databind.deser的com.fasterxml.jackson.databind.DeserializationContext.handleMissingInstantiator(DeserializationContext.java:1027)com.fasterxml.jackson.databind.deser.BeanDeserializerBase.deserializeFromObjectUsingNonDefault(BeanDeserializerBase.java:1290) .BeanDeserializer.deserializeFromObject(BeanDeserializer.java:326)at com.fasterxml.jackson.databind.deser.BeanDeserializer.deserialize(BeanDeserializer.java:159)at 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' ...

我不明白我哪里错了?

谢谢

1 回答

  • 0

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

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

    所以没关系谢谢

相关问题