当前位置: 首页 > 知识库问答 >
问题:

Spring boot@ResponseBody不序列化实体id

邢鸿博
2023-03-14

有一个奇怪的问题,想不出该怎么处理。有简单的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);
    }
}
@ResponseBody
@RequestMapping(method = RequestMethod.GET)
public List<Person> listPersons() {
    return personService.findAll();
}
[{
  "firstName": "Just",
  "middleName": "Test",
  "lastName": "Name",
  "comment": "Just a comment",
  "created": 1405774380410,
  "updated": null,
  "phoneNumbers": [{
    "phoneNumber": "74575754757"
  }, {
    "phoneNumber": "575757547"
  }, {
    "phoneNumber": "57547547547"
  }]
}]

UPD有双向Hibernate映射,也许它与问题有关。

共有1个答案

丰超
2023-03-14

我最近遇到了同样的问题,这是因为spring-boot-starter-data-rest默认情况下就是这样工作的。请参阅我的SO问题->在将应用程序迁移到Spring Boot后使用Spring Data Rest时,我观察到具有@id的实体属性不再被封送到JSON

要自定义它的行为方式,可以扩展RepositoryRestConfigurerAdapter以公开特定类的ID。

import org.springframework.context.annotation.Configuration;
import org.springframework.data.rest.core.config.RepositoryRestConfiguration;
import org.springframework.data.rest.webmvc.config.RepositoryRestConfigurerAdapter;

@Configuration
public class RepositoryConfig extends RepositoryRestConfigurerAdapter {
    @Override
    public void configureRepositoryRestConfiguration(RepositoryRestConfiguration config) {
        config.exposeIdsFor(Person.class);
    }
}
 类似资料:
  • 问题内容: 有一个奇怪的问题,无法弄清楚如何处理。有简单的POJO: 其余端点: 在json响应中,除了Id之外,还有其他所有字段,我需要在前端编辑/删除人员。如何配置Spring Boot来序列化ID? 这就是现在的响应: UPD具有双向hibernate映射,可能与问题有关。 问题答案: 我最近遇到了同样的问题,这是因为默认情况下是这样工作的。请参阅我的SO问题-> 在将应用程序迁移到Spri

  • 我读过一些关于hibernate的话题 “如果实体实例作为分离对象通过值传递,例如通过会话bean的远程业务接口,则类必须实现可序列化接口。”(c) 我有:使用Hibernate的简单Spring MVC项目。我有MyEntityDataTable,并且可以通过应用程序中的用户编辑它。 > 用户向getMyEntity()发出请求,并获取空的MyEntity对象 然后在表单中他设置了所有需要的参数

  • 问题内容: 有谁知道那里是否有一个能够从实体类中剥离Hibernate集合以使其可序列化的框架?我看了一下BeanLib,但它似乎只做实体的深层副本,而不允许我为实体类中的集合类型指定实现映射。BeanLib当前不适用于Hibernate 3.5和Spring 3(我确实修改了源代码并能够使其正常工作,但我不想这样做)。吉利德(Gilead)似乎是一个选择,但似乎颇具侵略性。我宁愿使用简单的深度复

  • 本文向大家介绍SpringBoot Redis配置Fastjson进行序列化和反序列化实现,包括了SpringBoot Redis配置Fastjson进行序列化和反序列化实现的使用技巧和注意事项,需要的朋友参考一下 FastJson是阿里开源的一个高性能的JSON框架,FastJson数据处理速度快,无论序列化(把JavaBean对象转化成Json格式的字符串)和反序列化(把JSON格式的字符串转

  • 问题内容: 我想通过实施将其序列化为Json 该映射序列化为非标准。我想在单元测试中测试此行为。 问题答案: 你不能像这样测试。你在这里做什么 正在建立 出站 响应。在JAX-RS框架中,发出响应后,例如 它仍然需要通过序列化到JSON。 阅读有关实体提供者的更多信息 话虽如此,泽西岛有一个测试框架,我们可以用来测试我们的资源方法。您可以在Github上找到所有官方示例 一个样本(有一些改动):