JSON 解析错误:无法构造 java.time.LocalDate 的实例:没有字符串参数构造函数/工厂方法来从字符串值反序列化

2024-02-01

我是 Spring Data REST 项目的新手,我正在尝试创建我的第一个 RESTful 服务。任务很简单,但我被困住了。

我想使用 RESTful API 对存储在嵌入式数据库中的用户数据执行 CRUD 操作。

但我不知道如何让Spring框架将birthData处理为“1999-12-15”并将其存储为LocalDate。 @JsonFormat 注释没有帮助。

目前我收到错误:

HTTP/1.1 400 
Content-Type: application/hal+json;charset=UTF-8
Transfer-Encoding: chunked
Date: Thu, 24 Aug 2017 13:36:51 GMT
Connection: close

{"cause":{"cause":null,"message":"Can not construct instance of java.time.LocalDate: 
no String-argument constructor/factory method to deserialize from String value ('1999-10-10')\n 
at [Source: org.apache.catalina.connector.CoyoteInputStream@4ee2a60e; 
line: 1, column: 65] (through reference chain: ru.zavanton.entities.User[\"birthDate\"])"},
"message":"JSON parse error: Can not construct instance of java.time.LocalDate: 
no String-argument constructor/factory method to deserialize from String value ('1999-10-10'); nested exception is com.fasterxml.jackson.databind.JsonMappingException: 
Can not construct instance of java.time.LocalDate: no String-argument constructor/factory method to deserialize from String value ('1999-10-10')\n 
at [Source: org.apache.catalina.connector.CoyoteInputStream@4ee2a60e; line: 1, column: 65] (through reference chain: ru.zavanton.entities.User[\"birthDate\"])"}

如何让它工作,以便客户端调用如下:

curl -i -X POST -H "Content-Type:application/json" -d "{  \"firstName\" : \"John\",  \"lastName\" : \"Johnson\", \"birthDate\" : \"1999-10-10\", \"email\" : \"[email protected] /cdn-cgi/l/email-protection\" }" http://localhost:8080/users

实际上会将实体存储到数据库中。

以下是有关课程的信息。

用户等级:

package ru.zavanton.entities;


import com.fasterxml.jackson.annotation.JsonFormat;

import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import java.time.LocalDate;

@Entity
public class User {

    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    private long id;

    private String firstName;
    private String lastName;

    @JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd")
    private LocalDate birthDate;

    private String email;
    private String password;

    public long getId() {
        return id;
    }

    public void setId(long id) {
        this.id = id;
    }

    public String getFirstName() {
        return firstName;
    }

    public void setFirstName(String firstName) {
        this.firstName = firstName;
    }

    public String getLastName() {
        return lastName;
    }

    public void setLastName(String lastName) {
        this.lastName = lastName;
    }

    public LocalDate getBirthDate() {
        return birthDate;
    }

    public void setBirthDate(LocalDate birthDate) {
        this.birthDate = birthDate;
    }

    public String getEmail() {
        return email;
    }

    public void setEmail(String email) {
        this.email = email;
    }

    public String getPassword() {
        return password;
    }

    public void setPassword(String password) {
        this.password = password;
    }
}

用户存储库类:

package ru.zavanton.repositories;

import org.springframework.data.repository.PagingAndSortingRepository;
import org.springframework.data.repository.query.Param;
import org.springframework.data.rest.core.annotation.RepositoryRestResource;
import ru.zavanton.entities.User;

@RepositoryRestResource(collectionResourceRel = "users", path = "users")
public interface UserRepository extends PagingAndSortingRepository<User, Long> {

    User findByEmail(@Param("email") String email);

}

应用类:

package ru.zavanton;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

@SpringBootApplication
public class Application {

    public static void main(String[] args) {

        SpringApplication.run(Application.class, args);

    }
}

您需要 Jackson 依赖来进行此序列化和反序列化。

添加此依赖项:

Gradle:

compile("com.fasterxml.jackson.datatype:jackson-datatype-jsr310:2.9.4")

Maven:

<dependency>
    <groupId>com.fasterxml.jackson.datatype</groupId>
    <artifactId>jackson-datatype-jsr310</artifactId>
</dependency>

之后,您需要告诉 Jackson ObjectMapper 使用 JavaTimeModule。 要做到这一点, 在主类中自动装配 ObjectMapper 并向其注册 JavaTimeModule。

import javax.annotation.PostConstruct;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.datatype.jsr310.JavaTimeModule;

@SpringBootApplication
public class MockEmployeeApplication {

  @Autowired
  private ObjectMapper objectMapper;

  public static void main(String[] args) {
    SpringApplication.run(MockEmployeeApplication.class, args);

  }

  @PostConstruct
  public void setUp() {
    objectMapper.registerModule(new JavaTimeModule());
  }
}

在那之后, 您的 LocalDate 和 LocalDateTime 应正确序列化和反序列化。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

JSON 解析错误:无法构造 java.time.LocalDate 的实例:没有字符串参数构造函数/工厂方法来从字符串值反序列化 的相关文章

随机推荐

  • 无符号函数必须返回一些东西吗?

    嘿 我正在做一个练习 我必须用 C 编写一个无符号函数 我有一个问题 我是否必须因为函数的类型而返回一些东西 还是可以选择的 在正常使用中 任何声明返回值的函数都应该返回一个值 这很大程度上是一个良好的编程实践的问题 未能返回值通常是错误的
  • 从 Java 类生成 JSON 模式

    我有一个 POJO 类 public class Stock int id String name Date date 是否有任何注释或开发框架 API 可以将 POJO 转换为 JSON 模式 如下所示 id type int name
  • 如何获取 Qt 应用程序的当前工作目录路径?

    我正在使用 Qt 库用 C 编写程序 我想获取我的程序的当前工作目录 我找到了QDir 当前路径 and QCoreApplication applicationDirPath 函数 但它们返回应用程序可执行文件所在的目录 我不想获取包含应
  • 选择许多三层深度

    我可以使用 SelectMany 展平集合中子集合的结果 a list of Foos a Foo contains a List of Bars var source new List
  • 使用 lm 对独特因子组合的子集进行回归

    我想对由分组变量的独特组合定义的子集自动执行简单的多元回归 我有一个数据框 其中包含多个分组变量 df1 1 6 和一些自变量 df1 8 10 以及响应 df1 7 这是数据的摘录 structure list Surface struc
  • HttpsServer 使用curl 导致CPU 负载100%

    我已经围绕 Java 创建了一个最小的应用程序HttpsServer https docs oracle com en java javase 11 docs api jdk httpserver com sun net httpserve
  • LogonUserEx、DuplicateTokenEx 用于在 C# 中使用 ObjectContext 进行模拟

    我们有一个特定的 SQL Server 我们需要从厚客户端 Net 4 0 WPF 访问它 并且我们用于该连接的唯一凭据是 服务 帐户 该帐户实际上是具有 SQL 权限的 Active Directory 帐户服务器 我在整个项目中使用实体
  • 进程页表

    我有兴趣更好地了解虚拟内存和页面机制 特别是 Windows x86 系统 根据我从各种在线资源收集的信息 包括在 SO 上发布的其他问题 1 每个进程的单独页表位于同一进程的内核地址空间内 2 每个进程只有一个页表 包含虚拟页到物理页 或
  • Java:如何有效地检查空指针

    有一些模式可以检查方法的参数是否已被赋予null value 第一个 经典的 这在自制代码中很常见 而且很容易理解 public void method1 String arg if arg null throw new NullPoint
  • 如何在R中的循环中获取索引

    我有一个字符类型向量 其中包含所有名称列表 所以我循环遍历每个名 称并执行一些操作 这个循环不是基于索引 长度 我想保持这种方式 但是 如果我想访问循环中的索引值 我该如何获取它 Ex names lt c name1 name2 for
  • 无法为表视图控制器 (UITableViewController) 选择自定义类

    首先我要说的是 我已经尝试退出并重新启动 Xcode 以及删除项目的派生数据 但无济于事 我现在已经无计可施了 基本上 我创建了一个自定义ViewController我想使用的类 但无法选择它 事实上 使用自定义类下拉菜单 我只能选择默认的
  • 是否有一个始终可写的持久位置可以被包用作数据缓存?

    R 包是否存在可以存储缓存数据的预定义位置 数据应该在会话之间持续存在 我正在考虑创建一个子目录 R LIBS USER package name 但我不确定这是否是可移植的 以及如果我的软件包安装在系统范围内 这是否是 允许的 想法如下
  • 如何在 Mac 上安装 Python 的 pip3?

    我正在尝试安装 pip3 但运气不佳 另外 我尝试过sudo install但它不起作用 如何在 Mac 上安装 pip3 sudo easy install pip3 Password Searching for pip3 Reading
  • 根据另一个下拉列表的值更改下拉列表的值

    我需要根据下拉列表 1 的值更改下拉列表 2 上的选定值 我读了很多帖子 但找不到解决方案 下拉列表 1
  • 谷歌搜索趋势

    我们可以根据位置获取Google的热门趋势 是否有可能根据 iPhone 等特定术语提取 google 上的搜索趋势 我们搜索与 iphone 相关的术语历史记录 此功能是由谷歌或任何其他搜索引擎提供的吗 编辑 是否可以获取按主题分类的搜索
  • 如何通过一个命令行完成 git fetch、checkout 和 pull?

    每次当我需要在本地测试我的团队成员代码时 我都会运行 3 个命令 像那样 git fetch remote name branch name git checkout branch name git pull origin master o
  • d3.js 中 svg 和 canvas 的区别

    我是 d3 js 的新手 我发现有两种方法可以绘制对象 SVG 和 Canvas 我的用例大约是 我已经尝试过一些使用画布的例子 它看起来很棒 我看到周围有一个 SO 帖子SVG 和 Canvas 之间的区别 https stackover
  • Php Checkbox - 进行选中和取消选中

    我尝试解决一个问题 这是我的代码
  • 实现这个复合 GetHashCode() 的最佳方法是什么

    我有一个简单的课程 public class TileName int Zoom X Y public override bool Equals object obj var o obj as TileName return o null
  • JSON 解析错误:无法构造 java.time.LocalDate 的实例:没有字符串参数构造函数/工厂方法来从字符串值反序列化

    我是 Spring Data REST 项目的新手 我正在尝试创建我的第一个 RESTful 服务 任务很简单 但我被困住了 我想使用 RESTful API 对存储在嵌入式数据库中的用户数据执行 CRUD 操作 但我不知道如何让Sprin