Tem um problema estranho e não consigo descobrir como lidar com ele. Tenha um POJO simples:
@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);
}
}
e ponto final de descanso:
@ResponseBody
@RequestMapping(method = RequestMethod.GET)
public List<Person> listPersons() {
return personService.findAll();
}
Na resposta json, existem todos os campos, exceto Id, que preciso no lado frontal para editar / excluir pessoa. Como posso configurar a inicialização do Spring para serializar Id também?
É assim que a resposta se parece agora:
[{
"firstName": "Just",
"middleName": "Test",
"lastName": "Name",
"comment": "Just a comment",
"created": 1405774380410,
"updated": null,
"phoneNumbers": [{
"phoneNumber": "74575754757"
}, {
"phoneNumber": "575757547"
}, {
"phoneNumber": "57547547547"
}]
}]
UPD Possui mapeamento de hibernação bidirecional, talvez esteja de alguma forma relacionado ao problema.
java
json
spring
spring-boot
Konstantin
fonte
fonte
@RestController
na classe do controlador e remover@ResponseBody
dos métodos. Também sugiro ter classes DTO para lidar com solicitações / respostas json em vez de objetos de domínio.Respostas:
Recentemente, tive o mesmo problema e é assim que
spring-boot-starter-data-rest
funciona por padrão. Veja minha pergunta sobre SO -> Ao usar Spring Data Rest depois de migrar um aplicativo para Spring Boot, observei que as propriedades de entidade com @Id não são mais enviadas para JSONPara personalizar como ele se comporta, você pode estender
RepositoryRestConfigurerAdapter
para expor IDs para classes específicas.fonte
RepositoryRestConfigurerAdapter
inorg.springframework.data.rest.webmvc.config
The type RepositoryRestConfigurerAdapter is deprecated
. Também não parece funcionarRepositoryRestConfigurerAdapter
está obsoleto nas versões mais recentes, você deve implementarRepositoryRestConfigurer
diretamente (usar emimplements RepositoryRestConfigurer
vez deextends RepositoryRestConfigurerAdapter
)Observe que nas versões do Spring Boot anteriores
2.1.0.RELEASE
você deve estender o (agora obsoleto) emorg.springframework.data.rest.webmvc.config.RepositoryRestConfigurerAdapter
vez de implementarRepositoryRestConfigurer
diretamente.Anotação de amostra:
fonte
@SpringBootApplication
anotação) deve servir.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
, mas o método não foi chamado e os id ainda não foram expostos. Eu uso dados de primavera com dados de primavera mybatis: github.com/hatunet/spring-data-mybatisEntityManager
faz parte da especificação JPA e MyBatis não implementa JPA (dê uma olhada em Será que MyBatis segue JPA? ). Então, acho que você deve configurar todas as entidades uma a uma, usando oconfig.exposeIdsFor(...)
método como na resposta aceita .A resposta de @ eric-peladan não funcionou fora da caixa, mas foi bem parecida, talvez funcionasse para as versões anteriores do Spring Boot. Agora é assim que ele deve ser configurado, corrija-me se eu estiver errado:
fonte
Com o Spring Boot, você deve estender SpringBootRepositoryRestMvcConfiguration
se usar RepositoryRestMvcConfiguration, a configuração definida em application.properties pode não funcionar
Mas, para uma necessidade temporária, você pode usar a projeção para incluir id na serialização como:
}
fonte
A classe
RepositoryRestConfigurerAdapter
está obsoleta desde 3.1, implementeRepositoryRestConfigurer
diretamente.Fonte: https://docs.spring.io/spring-data/rest/docs/current-SNAPSHOT/api/org/springframework/data/rest/webmvc/config/RepositoryRestConfigurer.html
fonte
Maneira fácil: renomeie sua variável
private Long id;
paraprivate Long Id;
Funciona para mim. Você pode ler mais sobre isso aqui
fonte
fonte
Hm, ok, parece que encontrei a solução. Remover spring-boot-starter-data-rest do arquivo pom e adicionar @JsonManagedReference a phoneNumbers e @JsonBackReference para pessoa fornece a saída desejada. Em resposta, Json não está mais bem impresso, mas agora tem o Id. Não sei o que a bota de mola mágica faz sob o capô com essa dependência, mas eu não gosto dela :)
fonte
Module
que está registrado na SDR eu acredito.