2017-08-24 3 views
3

Je suis nouveau dans le projet Spring Data REST et j'essaye de créer mon premier service RESTful. La tâche est simple, mais je suis coincé. Je souhaite effectuer des opérations CRUD sur des données utilisateur stockées dans une base de données intégrée à l'aide de l'API RESTful.Erreur d'analyse JSON: Impossible de construire l'instance de java.time.LocalDate: no Constructeur d'argument de chaîne/méthode factory à désérialiser de la valeur String

Mais je n'arrive pas à comprendre comment faire en sorte que l'infrastructure de Spring traite le birthData comme "1999-12-15" et le stocke comme LocalDate. L'annotation @JsonFormat n'aide pas.

À l'heure actuelle je reçois l'erreur:

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\"])"} 

Comment faire fonctionner, de sorte que le client appelle comme:

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

sera effectivement stocker l'entité dans la base de données.

Voici les informations sur les classes.

La classe d'utilisateur:

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

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

} 

classe Application:

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

double possible de [linéariser/désérialiser java 8 java.time avec Jackson JSON mappeur] (https://stackoverflow.com/questions/27952472/serialize-deserialize-java-8 -java-time-avec-jackson-json-mapper) –

+2

Ajoutez https://github.com/FasterXML/jackson-modules-java8 comme dépendance à votre pom.xml – Cepr0

+0

Merci, @ Cepr0! J'ai ajouté la dépendance au fichier pom et cela a fonctionné comme un charme! – zavanton

Répondre

5

Comme il se trouve, il ne faut pas oublier d'inclure la dépendance Jacson dans le fichier pom. Ceci a résolu le problème pour moi:

<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

Que faire si même après avoir ajouté ces dépendances, cela ne fonctionne pas. Est-ce que je peux demander à Json d'ignorer ce param ou quelque chose comme ça? – Dish