Spring boot @ResponseBody n'est pas sérialiser l'id de l'entité
Avez un problème étrange et ne peuvent pas comprendre la façon de traiter avec elle.
Simple POJO:
@Entity
@Table(name = "persons")
public class Person {
@Id
@GeneratedValue
private Long id;
@Column(name = "first_name")
private String firstName;
@Column(name = "middle_name")
private String middleName;
@Column(name = "last_name")
private String lastName;
@Column(name = "comment")
private String comment;
@Column(name = "created")
private Date created;
@Column(name = "updated")
private Date updated;
@PrePersist
protected void onCreate() {
created = new Date();
}
@PreUpdate
protected void onUpdate() {
updated = new Date();
}
@Valid
@OrderBy("id")
@OneToMany(mappedBy = "person", fetch = FetchType.EAGER, cascade = CascadeType.ALL, orphanRemoval = true)
private List<PhoneNumber> phoneNumbers = new ArrayList<>();
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 getMiddleName() {
return middleName;
}
public void setMiddleName(String middleName) {
this.middleName = middleName;
}
public String getLastName() {
return lastName;
}
public void setLastName(String lastName) {
this.lastName = lastName;
}
public String getComment() {
return comment;
}
public void setComment(String comment) {
this.comment = comment;
}
public Date getCreated() {
return created;
}
public Date getUpdated() {
return updated;
}
public List<PhoneNumber> getPhoneNumbers() {
return phoneNumbers;
}
public void addPhoneNumber(PhoneNumber number) {
number.setPerson(this);
phoneNumbers.add(number);
}
@Override
public String toString() {
return ToStringBuilder.reflectionToString(this, ToStringStyle.SHORT_PREFIX_STYLE);
}
}
@Entity
@Table(name = "phone_numbers")
public class PhoneNumber {
public PhoneNumber() {}
public PhoneNumber(String phoneNumber) {
this.phoneNumber = phoneNumber;
}
@Id
@GeneratedValue
private Long id;
@Column(name = "phone_number")
private String phoneNumber;
@ManyToOne
@JoinColumn(name = "person_id")
private Person person;
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}
public String getPhoneNumber() {
return phoneNumber;
}
public void setPhoneNumber(String phoneNumber) {
this.phoneNumber = phoneNumber;
}
public Person getPerson() {
return person;
}
public void setPerson(Person person) {
this.person = person;
}
@Override
public String toString() {
return ToStringBuilder.reflectionToString(this, ToStringStyle.SHORT_PREFIX_STYLE);
}
}
et le point de terminaison rest:
@ResponseBody
@RequestMapping(method = RequestMethod.GET)
public List<Person> listPersons() {
return personService.findAll();
}
En réponse json il y a tous les champs sauf le numéro, dont j'ai besoin sur le front du côté de l'extrémité de modifier/supprimer des personne. Comment puis-je configurer le printemps de démarrage pour sérialiser Id?
C'est la façon dont la réponse ressemble à ça:
[{
"firstName": "Just",
"middleName": "Test",
"lastName": "Name",
"comment": "Just a comment",
"created": 1405774380410,
"updated": null,
"phoneNumbers": [{
"phoneNumber": "74575754757"
}, {
"phoneNumber": "575757547"
}, {
"phoneNumber": "57547547547"
}]
}]
UPD Ont bidirectionnel hibernate mapping, c'est peut-être en quelque sorte lié à la question.
- Pourriez-vous nous donner plus d'informations à propos de votre ressort de configuration? Ce json marshaller utilisez-vous? Par défaut, jackson, ...?
- En fait il n'y a pas de configuration particulière. Voulais essayer de printemps de démarrage 🙂 Ajouté printemps-amorçage-starter-données-reste de pom et de l'utilisation de @EnableAutoConfiguration c'est tout. Lire quelques tutoriels et semble que tous ont à travailler hors de la boîte. Et c'est, sauf que le champ Id. Mis à jour le post avec le point de terminaison de réponse.
- Au Printemps 4 vous devez également utiliser
@RestController
sur le contrôleur de classe et de supprimer@ResponseBody
de méthodes. Aussi, je vous suggérerais d'avoir DTO classes pour manipuler du json requêtes/réponses plutôt que des objets du domaine.
Vous devez vous connecter pour publier un commentaire.
J'ai récemment eu le même problème et c'est parce que c'est comment
spring-boot-starter-data-rest
fonctionne par défaut. Voir mon DONC, la question -> Lors de l'utilisation de Données du Printemps de Repos après la migration d'une application Spring Boot, j'ai observé que les propriétés d'entité avec @Id ne sont plus réunies pour JSONPour personnaliser la façon dont il se comporte, vous pouvez étendre
RepositoryRestConfigurerAdapter
pour exposer Id pour des classes spécifiques.RepositoryRestConfigurerAdapter
dansorg.springframework.data.rest.webmvc.config
The type RepositoryRestConfigurerAdapter is deprecated
. Aussi ne semble pas fonctionnerRepositoryRestConfigurerAdapter
est déconseillée dans les dernières versions, vous avez à mettre en œuvreRepositoryRestConfigurer
directement (utiliserimplements RepositoryRestConfigurer
au lieu deextends RepositoryRestConfigurerAdapter
)Noter que dans les versions de Spring Boot avant
2.1.0.RELEASE
vous devez étendre le (aujourd'hui obsolète)org.springframework.data.rest.webmvc.config.RepositoryRestConfigurerAdapter
au lieu de mettre en œuvreRepositoryRestConfigurer
directement.Exemple d'annotation:
@SpringBootApplication
annotation) doit être fine.Réponse de @eric-peladan à ne pas travailler hors de la boîte, mais il était assez proche, peut-être, qui a travaillé pour les versions précédentes de Printemps de Démarrage. Maintenant, c'est la façon dont il est censé être configuré au lieu de cela, corrigez-moi si je me trompe:
Avec Spring Boot vous avez étend SpringBootRepositoryRestMvcConfiguration
si vous utilisez RepositoryRestMvcConfiguration la configuration de définir dans l'application.propriétés peuvent ne pas travaillé
Mais pour un besoin temporaire
Vous pouvez utiliser la projection d'inclure id dans la sérialisation comme :
}
Moyen facile: changer le nom de votre variable
private Long id;
àprivate Long Id;
Fonctionne pour moi. Vous pouvez en lire plus à ce sujet ici
Hm, ok semble que j'ai trouvé la solution. Retrait de printemps-amorçage-starter-données-reste de pom fichier et l'ajout d' @JsonManagedReference à phoneNumbers et @JsonBackReference à personne donne de sortie souhaité. Json en réponse n'est pas joli imprimé, pas plus, mais maintenant il a Id. Ne sais pas ce qu'est la magie du printemps de démarrage effectue sous le capot avec cette dépendance, mais je n'aime pas ça 🙂
Module
qui est enregistré en DTS je crois.