Spring boot 没有从字符串值反序列化的字符串参数构造函数/工厂方法(';2018-12-14';)

Spring boot 没有从字符串值反序列化的字符串参数构造函数/工厂方法(';2018-12-14';),spring-boot,jackson,spring-rest,localdate,Spring Boot,Jackson,Spring Rest,Localdate,这个问题和一个问题几乎相同,但不同之处在于我试图将字符串设置为LocalDate。以下是来自STS的错误: 2018-12-14 00:47:04.507警告6216---[nio-8080-exec-2] .w.s.m.s.DefaultHandlerExceptionResolver:已解决 [org.springframework.http.converter.httpMessageNodeTableException: JSON分析错误:无法构造java.time.LocalDate的实

这个问题和一个问题几乎相同,但不同之处在于我试图将字符串设置为LocalDate。以下是来自STS的错误:

2018-12-14 00:47:04.507警告6216---[nio-8080-exec-2] .w.s.m.s.DefaultHandlerExceptionResolver:已解决 [org.springframework.http.converter.httpMessageNodeTableException: JSON分析错误:无法构造java.time.LocalDate的实例: 没有可从中反序列化的字符串参数构造函数/工厂方法 字符串值('2018-12-14');嵌套异常为 com.fasterxml.jackson.databind.JsonMappingException:无法构造 java.time.LocalDate实例:无字符串参数 从字符串值反序列化的构造函数/工厂方法 ('2018-12-14'),位于[来源:java.io。PushbackInputStream@73ff9989; 行:3,列:16](通过参考链: com.xxxxx.xxxxxx.model.request.ReservationRequest[“签入”])]

这是邮递员发来的:

{ “时间戳”:1544744824516, “状态”:400, “错误”:“错误请求”, “异常”:“org.springframework.http.converter.httpMessageEndableException”, “message”:“JSON解析错误:无法构造java.time.LocalDate的实例:没有字符串参数构造函数/工厂方法 从字符串值('2018-12-14')反序列化;嵌套异常为 com.fasterxml.jackson.databind.JsonMappingException:无法构造 java.time.LocalDate实例:无字符串参数 从字符串值反序列化的构造函数/工厂方法 ('2018-12-14')\n在[来源:java.io。PushbackInputStream@73ff9989; 行:3,列:16](通过参考链: com.xxxxx.xxxxx.model.request.ReservationRequest[\“checkin\”])“, “路径”:“/房间/预订/v1”}

后请求是:

{
    "id": 12345,
    "checkin": "2018-12-14",
    "checkout": "2018-12-17"
}
相关类别包括:

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.ObjectWriter;
import com.fasterxml.jackson.datatype.jsr310.JavaTimeModule;

@Configuration
public class ApiConfig {

    @Bean
    public ObjectMapper objectMapper() {
        ObjectMapper objectMapper = new ObjectMapper();
        objectMapper.registerModule(new JavaTimeModule());
        return new ObjectMapper();
    }

    @Bean
    public ObjectWriter objectWriter(ObjectMapper objectMapper) {
        return objectMapper.writerWithDefaultPrettyPrinter();
    }
}

jdk1.8;springBootVersion='1.5.17.RELEASE';名称:“jackson-datatype-jsr310”,版本:“2.9.7”

问题是为什么它不能与LocalDate一起正常工作

更新:尝试了解决方案,并添加了@JsonSerialize和@jsondesialize,两者都不是
objectMapper.disable(SerializationFeature.WRITE_DATES_as_timestamp)
objectMapper.configure(SerializationFeature.WRITE_DATES_作为时间戳,false)

现在看起来是这样的:

public class ReservationRequest {

    private Long id;
    @JsonSerialize(using = ToStringSerializer.class)
    @JsonDeserialize(using = LocalDateDeserializer.class)
    //@JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd")
    @DateTimeFormat(iso = DateTimeFormat.ISO.DATE)
    private LocalDate checkin;
    @JsonSerialize(using = ToStringSerializer.class)
    @JsonDeserialize(using = LocalDateDeserializer.class)
    //@JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd")
    @DateTimeFormat(iso = DateTimeFormat.ISO.DATE)
    private LocalDate checkout;

    public ReservationRequest() {
        super();
    }

所以,现在看起来它可以工作了,但我不知道它是否是一个好的解决方案?

我认为现在回复我面临的同样问题的帖子已经太迟了,下面的注释很有帮助

@JsonFormat(pattern = "yyyy-MM-dd")
private LocalDate dateOfBirth;

:)

我最近遇到了同样的问题,错误的原因是我的json字符串周围有双引号,当我删除它时,它工作得非常好

我认为问题就在这里

@Bean
public ObjectMapper objectMapper() {
    ObjectMapper objectMapper = new ObjectMapper();
    objectMapper.registerModule(new JavaTimeModule());
    return new ObjectMapper();
}
您必须返回已配置的
objectMapper
,而不是新实例:

@Bean
public ObjectMapper objectMapper() {
    ObjectMapper objectMapper = new ObjectMapper();
    objectMapper.configure(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS, false)
    objectMapper.registerModule(new JavaTimeModule()
            .addSerializer(LocalDate.class, new LocalDateSerializer(DateTimeFormatter.ofPattern("M/d/yyyy")))
            .addDeserializer(LocalDate.class, new LocalDateDeserializer(DateTimeFormatter.ofPattern("M/d/yyyy"))))
    return objectMapper;
}

试过了,没用。
@JsonFormat(pattern = "yyyy-MM-dd")
private LocalDate dateOfBirth;
@Bean
public ObjectMapper objectMapper() {
    ObjectMapper objectMapper = new ObjectMapper();
    objectMapper.registerModule(new JavaTimeModule());
    return new ObjectMapper();
}
@Bean
public ObjectMapper objectMapper() {
    ObjectMapper objectMapper = new ObjectMapper();
    objectMapper.configure(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS, false)
    objectMapper.registerModule(new JavaTimeModule()
            .addSerializer(LocalDate.class, new LocalDateSerializer(DateTimeFormatter.ofPattern("M/d/yyyy")))
            .addDeserializer(LocalDate.class, new LocalDateDeserializer(DateTimeFormatter.ofPattern("M/d/yyyy"))))
    return objectMapper;
}