Tiene un problema extraño y no sabe cómo solucionarlo. Tener 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);
}
}
y punto final de descanso:
@ResponseBody
@RequestMapping(method = RequestMethod.GET)
public List<Person> listPersons() {
return personService.findAll();
}
En la respuesta json, hay todos los campos excepto Id, que necesito en el lado frontal para editar / eliminar a la persona. ¿Cómo puedo configurar Spring Boot para serializar Id también?
Así es como se ve la respuesta ahora:
[{
"firstName": "Just",
"middleName": "Test",
"lastName": "Name",
"comment": "Just a comment",
"created": 1405774380410,
"updated": null,
"phoneNumbers": [{
"phoneNumber": "74575754757"
}, {
"phoneNumber": "575757547"
}, {
"phoneNumber": "57547547547"
}]
}]
UPD Tiene mapeo de hibernación bidireccional, tal vez esté relacionado de alguna manera con el problema.
java
json
spring
spring-boot
Konstantin
fuente
fuente
@RestController
en la clase de controlador y eliminar@ResponseBody
de los métodos. También sugeriría tener clases DTO para manejar solicitudes / respuestas json en lugar de objetos de dominio.Respuestas:
Recientemente tuve el mismo problema y es porque así es como
spring-boot-starter-data-rest
funciona de forma predeterminada. Vea mi pregunta SO -> Al usar Spring Data Rest después de migrar una aplicación a Spring Boot, he observado que las propiedades de la entidad con @Id ya no se agrupan en JSONPara personalizar cómo se comporta, puede ampliar
RepositoryRestConfigurerAdapter
para exponer los ID de clases específicas.fuente
RepositoryRestConfigurerAdapter
enorg.springframework.data.rest.webmvc.config
The type RepositoryRestConfigurerAdapter is deprecated
. Tampoco parece funcionarRepositoryRestConfigurerAdapter
está en desuso en las últimas versiones, debe implementarRepositoryRestConfigurer
directamente (usar enimplements RepositoryRestConfigurer
lugar deextends RepositoryRestConfigurerAdapter
)Tenga en cuenta que en las versiones de Spring Boot anteriores
2.1.0.RELEASE
, debe extender el (ahora en desuso) enorg.springframework.data.rest.webmvc.config.RepositoryRestConfigurerAdapter
lugar de implementarloRepositoryRestConfigurer
directamente.Ejemplo de anotación:
fuente
@SpringBootApplication
anotación) debería estar bien.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)
enMyRepositoryRestConfigurerAdapter
, pero el método no se llama y el ID todavía no están expuestos. Utilizo datos de Spring con datos de Spring mybatis: github.com/hatunet/spring-data-mybatisEntityManager
es parte de la especificación JPA y MyBatis no implementa JPA (eche un vistazo a ¿MyBatis sigue a JPA? ). Entonces, creo que debería configurar todas las entidades una por una, usando elconfig.exposeIdsFor(...)
método como en la respuesta aceptada .La respuesta de @ eric-peladan no funcionó de inmediato, pero estuvo bastante cerca, tal vez funcionó para versiones anteriores de Spring Boot. Ahora, así es como se supone que debe configurarse en su lugar, corrígeme si me equivoco:
fuente
Con Spring Boot, debe extender SpringBootRepositoryRestMvcConfiguration
si usa RepositoryRestMvcConfiguration, la configuración definida en application.properties puede no funcionar
Pero para una necesidad temporal, puede usar la proyección para incluir la identificación en la serialización como:
}
fuente
La clase
RepositoryRestConfigurerAdapter
ha quedado obsoleta desde 3.1, implementarRepositoryRestConfigurer
directamente.Fuente: https://docs.spring.io/spring-data/rest/docs/current-SNAPSHOT/api/org/springframework/data/rest/webmvc/config/RepositoryRestConfigurer.html
fuente
Manera fácil: cambie el nombre de su variable
private Long id;
aprivate Long Id;
Funciona para mi. Puedes leer más sobre esto aquí.
fuente
fuente
Hm, parece que encontré la solución. Eliminar spring-boot-starter-data-rest del archivo pom y agregar @JsonManagedReference a phoneNumbers y @JsonBackReference a person da el resultado deseado. Json en respuesta ya no está bastante impreso, pero ahora tiene Id. No sé qué hace la bota de resorte mágica debajo del capó con esta dependencia, pero no me gusta :)
fuente
Module
que está registrado por SDR, creo.