Habe ein seltsames Problem und kann nicht herausfinden, wie ich damit umgehen soll. Haben Sie einfache 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);
}
}
und Ruheendpunkt:
@ResponseBody
@RequestMapping(method = RequestMethod.GET)
public List<Person> listPersons() {
return personService.findAll();
}
In der json-Antwort gibt es alle Felder außer ID, die ich auf der Front-End-Seite benötige, um eine Person zu bearbeiten / löschen. Wie kann ich Spring Boot so konfigurieren, dass es auch die ID serialisiert?
So sieht die Antwort jetzt aus:
[{
"firstName": "Just",
"middleName": "Test",
"lastName": "Name",
"comment": "Just a comment",
"created": 1405774380410,
"updated": null,
"phoneNumbers": [{
"phoneNumber": "74575754757"
}, {
"phoneNumber": "575757547"
}, {
"phoneNumber": "57547547547"
}]
}]
UPD Bidirektionales Hibernate-Mapping, möglicherweise hängt es irgendwie mit dem Problem zusammen.
java
json
spring
spring-boot
Konstantin
quelle
quelle
@RestController
Controller-Klasse verwenden und@ResponseBody
aus Methoden entfernen . Außerdem würde ich vorschlagen, DTO-Klassen zu haben, um JSON-Anforderungen / -Antworten anstelle von Domänenobjekten zu verarbeiten.Antworten:
Ich hatte kürzlich das gleiche Problem und das liegt daran, dass dies
spring-boot-starter-data-rest
standardmäßig so funktioniert. Siehe meine SO-Frage -> Bei der Verwendung von Spring Data Rest nach der Migration einer App zu Spring Boot habe ich festgestellt, dass Entitätseigenschaften mit @Id nicht mehr in JSON gemarshallt werdenUm das Verhalten anzupassen, können Sie
RepositoryRestConfigurerAdapter
IDs für bestimmte Klassen verfügbar machen.quelle
RepositoryRestConfigurerAdapter
inorg.springframework.data.rest.webmvc.config
The type RepositoryRestConfigurerAdapter is deprecated
.RepositoryRestConfigurerAdapter
ist in den neuesten Versionen veraltet, müssen SieRepositoryRestConfigurer
direkt implementieren (implements RepositoryRestConfigurer
anstelle von verwendenextends RepositoryRestConfigurerAdapter
)Beachten Sie, dass Sie in früheren Versionen von Spring Boot
2.1.0.RELEASE
die (jetzt veraltete) Version erweitern müssen,org.springframework.data.rest.webmvc.config.RepositoryRestConfigurerAdapter
anstatt sieRepositoryRestConfigurer
direkt zu implementieren .Beispielanmerkung:
quelle
@SpringBootApplication
Anmerkung) sollte in Ordnung sein.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)
In hinzuzufügenMyRepositoryRestConfigurerAdapter
, aber die Methode wird nicht aufgerufen und die ID wird immer noch nicht angezeigt. Ich verwende Frühlingsdaten mit Frühlingsdaten mybatis: github.com/hatunet/spring-data-mybatisEntityManager
ist Teil der JPA-Spezifikation und MyBatis implementiert JPA nicht (siehe Verfolgt MyBatis JPA? ). Ich denke, Sie sollten alle Entitäten einzeln konfigurieren und dabei dieconfig.exposeIdsFor(...)
Methode wie in der akzeptierten Antwort verwenden .Die Antwort von @ eric-peladan hat nicht sofort funktioniert, war aber ziemlich nah dran, vielleicht hat das bei früheren Versionen von Spring Boot funktioniert. So soll es stattdessen konfiguriert werden. Korrigieren Sie mich, wenn ich falsch liege:
quelle
Mit Spring Boot müssen Sie SpringBootRepositoryRestMvcConfiguration erweitern,
wenn Sie RepositoryRestMvcConfiguration verwenden. Die in application.properties definierte Konfiguration funktioniert möglicherweise nicht
Aber für einen vorübergehenden Bedarf Sie können die Projektion verwenden, um ID in die Serialisierung einzubeziehen, wie:
}}
quelle
Die Klasse
RepositoryRestConfigurerAdapter
ist seit 3.1 veraltet,RepositoryRestConfigurer
direkt implementieren .Schriftart: https://docs.spring.io/spring-data/rest/docs/current-SNAPSHOT/api/org/springframework/data/rest/webmvc/config/RepositoryRestConfigurer.html
quelle
Einfacher Weg: Benennen Sie Ihre Variable
private Long id;
in umprivate Long Id;
Funktioniert bei mir. Sie können mehr darüber lesen Sie hier
quelle
quelle
Hm, ok, anscheinend habe ich die Lösung gefunden. Wenn Sie Spring-Boot-Starter-Data-Rest aus der POM-Datei entfernen und @JsonManagedReference zu phoneNumbers und @JsonBackReference zu person hinzufügen, erhalten Sie die gewünschte Ausgabe. Json als Antwort ist nicht mehr schön gedruckt, aber jetzt hat es Id. Ich weiß nicht, was Magic Spring Boot unter der Haube mit dieser Abhängigkeit macht, aber ich mag es nicht :)
quelle
Module
, der von SDR registriert ist, glaube ich.