Memiliki masalah yang aneh dan tidak tahu cara mengatasinya. Miliki POJO sederhana:
@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);
}
}
dan titik akhir istirahat:
@ResponseBody
@RequestMapping(method = RequestMethod.GET)
public List<Person> listPersons() {
return personService.findAll();
}
Dalam respon json ada semua field kecuali Id, yang saya butuhkan di front end untuk mengedit / menghapus orang. Bagaimana saya bisa mengkonfigurasi boot musim semi untuk membuat ID serial juga?
Seperti itulah tanggapannya sekarang:
[{
"firstName": "Just",
"middleName": "Test",
"lastName": "Name",
"comment": "Just a comment",
"created": 1405774380410,
"updated": null,
"phoneNumbers": [{
"phoneNumber": "74575754757"
}, {
"phoneNumber": "575757547"
}, {
"phoneNumber": "57547547547"
}]
}]
UPD Memiliki pemetaan hibernasi dua arah, mungkin entah bagaimana terkait dengan masalah.
java
json
spring
spring-boot
Konstantin
sumber
sumber
@RestController
pada kelas pengontrol dan menghapus@ResponseBody
dari metode. Juga saya akan menyarankan memiliki kelas DTO untuk menangani permintaan / tanggapan json daripada objek domain.Jawaban:
Saya baru-baru ini mengalami masalah yang sama dan itu karena cara
spring-boot-starter-data-rest
kerjanya secara default. Lihat pertanyaan SO saya -> Saat menggunakan Spring Data Rest setelah memigrasi aplikasi ke Spring Boot, saya telah mengamati bahwa properti entitas dengan @Id tidak lagi diatur ke JSONUntuk menyesuaikan perilakunya, Anda dapat memperluas
RepositoryRestConfigurerAdapter
untuk mengekspos ID untuk kelas tertentu.sumber
RepositoryRestConfigurerAdapter
diorg.springframework.data.rest.webmvc.config
The type RepositoryRestConfigurerAdapter is deprecated
. Juga tampaknya tidak bekerjaRepositoryRestConfigurerAdapter
sudah usang di versi terbaru, Anda harus menerapkanRepositoryRestConfigurer
secara langsung (gunakanimplements RepositoryRestConfigurer
sebagai penggantiextends RepositoryRestConfigurerAdapter
)Perhatikan bahwa dalam versi Spring Boot sebelum
2.1.0.RELEASE
Anda harus memperpanjang (sekarang sudah usang)org.springframework.data.rest.webmvc.config.RepositoryRestConfigurerAdapter
alih-alih mengimplementasikanRepositoryRestConfigurer
secara langsung.Contoh anotasi:
sumber
@SpringBootApplication
anotasi) seharusnya baik-baik saja.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)
dalamMyRepositoryRestConfigurerAdapter
, namun metode ini tidak disebut dan id masih tidak terkena. Saya menggunakan data Musim Semi dengan data musim semi mybatis: github.com/hatunet/spring-data-mybatisEntityManager
adalah bagian dari spesifikasi JPA dan MyBatis tidak mengimplementasikan JPA (lihat Apakah MyBatis mengikuti JPA? ). Jadi, saya pikir Anda harus mengonfigurasi semua entitas satu per satu, menggunakanconfig.exposeIdsFor(...)
metode seperti pada jawaban yang diterima .Jawaban dari @ eric-peladan tidak langsung berhasil, tetapi cukup mendekati, mungkin berfungsi untuk Spring Boot versi sebelumnya. Sekarang beginilah seharusnya dikonfigurasi, perbaiki saya jika saya salah:
sumber
Dengan Spring Boot Anda harus memperluas SpringBootRepositoryRestMvcConfiguration
jika Anda menggunakan RepositoryRestMvcConfiguration , konfigurasi yang ditentukan dalam application.properties mungkin tidak berfungsi
Tetapi untuk kebutuhan sementara Anda dapat menggunakan proyeksi untuk memasukkan id dalam serialisasi seperti:
}
sumber
Kelas
RepositoryRestConfigurerAdapter
sudah tidak digunakan lagi sejak 3.1, terapkanRepositoryRestConfigurer
secara langsung.Font: https://docs.spring.io/spring-data/rest/docs/current-SNAPSHOT/api/org/springframework/data/rest/webmvc/config/RepositoryRestConfigurer.html
sumber
Cara mudah: ganti nama variabel Anda
private Long id;
menjadiprivate Long Id;
Bekerja untuk saya. Anda dapat membaca lebih lanjut di sini
sumber
sumber
Hm, oke sepertinya saya menemukan solusinya. Menghapus spring-boot-starter-data-rest dari file pom dan menambahkan @JsonManagedReference ke phoneNumbers dan @JsonBackReference ke person memberikan keluaran yang diinginkan. Json sebagai tanggapan tidak cukup dicetak lagi tetapi sekarang memiliki Id. Tidak tahu apa yang dilakukan sepatu bot musim semi ajaib dengan ketergantungan ini, tetapi saya tidak menyukainya :)
sumber
Module
yang didaftarkan oleh SDR saya percaya.