2017-08-24 830 views
3

我是Spring Data REST项目的新手,我试图创建我的第一个RESTful服务。任务很简单,但我被卡住了。JSON解析错误:无法构造java.time.LocalDate的实例:no String-argument构造函数/工厂方法从字符串值反序列化

我想对使用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: [email protected]; 
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: [email protected]; 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]\" }" 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; 
    } 
} 

的UserRepository类:

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

    } 
} 
+0

的可能重复[序列化/反序列化的Java 8 java.time与杰克逊JSON映射器(https://stackoverflow.com/questions/27952472/serialize-deserialize-java-8 -java-time-with-jackson-json-mapper) –

+2

添加https://github.com/FasterXML/jackson-modules-java8作为依赖到你的pom.xml – Cepr0

+0

谢谢,@ Cepr0!我添加了对pom文件的依赖关系,它像一个魅力一样工作! – zavanton

回答

5

事实证明,人们不应该忘记,包括jacson依赖成pom文件。这解决了这个问题对我来说:

<dependency> 
    <groupId>com.fasterxml.jackson.module</groupId> 
    <artifactId>jackson-module-parameter-names</artifactId> 
</dependency> 
<dependency> 
    <groupId>com.fasterxml.jackson.datatype</groupId> 
    <artifactId>jackson-datatype-jdk8</artifactId> 
</dependency> 
<dependency> 
    <groupId>com.fasterxml.jackson.datatype</groupId> 
    <artifactId>jackson-datatype-jsr310</artifactId> 
</dependency> 
+0

如果添加这些依赖关系后它不起作用。我有什么办法可以让Json忽略这个参数或类似的东西吗? – Dish

相关问题