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);
}
}
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) –
Ajoutez https://github.com/FasterXML/jackson-modules-java8 comme dépendance à votre pom.xml – Cepr0
Merci, @ Cepr0! J'ai ajouté la dépendance au fichier pom et cela a fonctionné comme un charme! – zavanton