Vous avez un problème étrange et vous ne savez pas comment y faire face. Avoir un POJO simple:
@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 point final de repos:
@ResponseBody
@RequestMapping(method = RequestMethod.GET)
public List<Person> listPersons() {
return personService.findAll();
}
Dans la réponse json, il y a tous les champs sauf Id, dont j'ai besoin du côté frontal pour modifier / supprimer la personne. Comment puis-je configurer Spring Boot pour sérialiser également l'ID?
Voilà à quoi ressemble la réponse maintenant:
[{
"firstName": "Just",
"middleName": "Test",
"lastName": "Name",
"comment": "Just a comment",
"created": 1405774380410,
"updated": null,
"phoneNumbers": [{
"phoneNumber": "74575754757"
}, {
"phoneNumber": "575757547"
}, {
"phoneNumber": "57547547547"
}]
}]
UPD Avoir un mappage bidirectionnel d'hibernation, c'est peut-être lié à un problème.
java
json
spring
spring-boot
Konstantin
la source
la source
@RestController
sur la classe de contrôleur et supprimer@ResponseBody
des méthodes. Aussi, je suggérerais d'avoir des classes DTO pour gérer les demandes / réponses json au lieu des objets de domaine.Réponses:
J'ai récemment eu le même problème et c'est parce que c'est comme ça que ça
spring-boot-starter-data-rest
marche par défaut. Voir ma question SO -> Lors de l'utilisation de Spring Data Rest après la migration d'une application vers Spring Boot, j'ai observé que les propriétés d'entité avec @Id ne sont plus rassemblées vers JSONPour personnaliser son comportement, vous pouvez l'étendre
RepositoryRestConfigurerAdapter
pour exposer des ID pour des classes spécifiques.la source
RepositoryRestConfigurerAdapter
dansorg.springframework.data.rest.webmvc.config
The type RepositoryRestConfigurerAdapter is deprecated
. Ne semble pas non plus fonctionnerRepositoryRestConfigurerAdapter
est obsolète dans les dernières versions, vous devez l'implémenterRepositoryRestConfigurer
directement (utiliser à laimplements RepositoryRestConfigurer
place deextends RepositoryRestConfigurerAdapter
)Notez que dans les versions de Spring Boot antérieures à,
2.1.0.RELEASE
vous devez étendre le (désormais obsolète)org.springframework.data.rest.webmvc.config.RepositoryRestConfigurerAdapter
au lieu de l'implémenterRepositoryRestConfigurer
directement.Exemple d'annotation:
la source
@SpringBootApplication
annotation) devrait convenir.Field entityManager in com.myapp.api.config.context.security.RepositoryRestConfig required a bean of type 'javax.persistence.EntityManager' that could not be found.
@ConditionalOnBean(EntityManager.class)
inMyRepositoryRestConfigurerAdapter
, mais la méthode n'est pas appelée et l'identifiant n'est toujours pas exposé. J'utilise les données Spring avec les données Spring mybatis: github.com/hatunet/spring-data-mybatisEntityManager
fait partie de la spécification JPA et MyBatis n'implémente pas JPA (jetez un œil à MyBatis suit-il JPA? ). Donc, je pense que vous devriez configurer toutes les entités une par une, en utilisant laconfig.exposeIdsFor(...)
méthode comme dans la réponse acceptée .La réponse de @ eric-peladan n'a pas fonctionné immédiatement, mais était assez proche, peut-être que cela fonctionnait pour les versions précédentes de Spring Boot. Maintenant, voici comment il est censé être configuré à la place, corrigez-moi si je me trompe:
la source
Avec Spring Boot, vous devez étendre SpringBootRepositoryRestMvcConfiguration
si vous utilisez RepositoryRestMvcConfiguration, la configuration définie dans application.properties peut ne pas fonctionner
Mais pour un besoin temporaire, vous pouvez utiliser la projection pour inclure l' id dans la sérialisation comme:
}
la source
La classe
RepositoryRestConfigurerAdapter
est obsolète depuis la version 3.1, implémentéeRepositoryRestConfigurer
directement.Police: https://docs.spring.io/spring-data/rest/docs/current-SNAPSHOT/api/org/springframework/data/rest/webmvc/config/RepositoryRestConfigurer.html
la source
Méthode simple: renommez votre variable
private Long id;
enprivate Long Id;
Travaille pour moi. Vous pouvez en savoir plus ici
la source
la source
Hm, ok semble avoir trouvé la solution. La suppression de spring-boot-starter-data-rest du fichier pom et l'ajout de @JsonManagedReference à phoneNumbers et @JsonBackReference à la personne donne le résultat souhaité. Json en réponse n'est plus assez imprimé mais maintenant il a un identifiant. Je ne sais pas ce que la botte à ressort magique effectue sous le capot avec cette dépendance mais je n'aime pas ça :)
la source
Module
qui est enregistré par SDR je crois.