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

RepositoryRestMvcConfiguration的ObjectMapper与Spring Boot默认ObjectMapper?

颛孙英才
2023-03-14

我正在使用RepositoryRestMvcConfiguration来微调其余存储库行为:

@Configuration
public class WebConfig extends RepositoryRestMvcConfiguration {
    @Override
    protected void configureRepositoryRestConfiguration(RepositoryRestConfiguration config) {
      config.setReturnBodyOnCreate(true);
}

缺点是扩展类引入了自己的ObjectMapper bean,导致此处描述的冲突。推荐的解决方法是使用扩展类将ObjectMapper bean标记为@Prime,但是RepositoryRestMvcConfiguration中的bean在序列化嵌套实体时具有不同的行为。

让我们假设以下情况:

@Entity class Parent {
    @Id Long id;
    @OneToMany @JsonManagedReference List<Child> children;
    // usual getters and setters for fields...
}

@Entity class Child {
    @Id Long id;
    @ManyToOne @JsonBackReference Parent parent;
    @ManyToOne @JsonBackReference School school;
    public getSchooldId() { return school.getId(); }
    // usual getters and setters for fields...
}

@Entity class School {
    @Id Long id;
    @OneToMany @JsonManagedReference List<Child> children;
    // usual getters and setters for fields...
} 

使用默认的Spring Boot ObjectMapper可获得预期结果(呈现嵌套实体):

{"id": 1, "children":[{"id":2, "schoolId":7},{"id":3, "schooldId":8}]}

但是,存储库RestMvcConfiguration中的ObjectMapper会忽略子实体:

{"id": 1}

配置存储库RestMvcConfiguration ObjectMapper以实现与Spring Boot默认值相同的行为的正确方法是什么?

共有1个答案

刁文光
2023-03-14

RepositoryRestMvcConfiguration创建两个objectMapper对象。

    < li >供内部框架使用的对象映射器。 < li>halObjectMapper负责呈现集合< code >资源和链接。

您可以尝试通过使用限定符自动布线对象映射器来获得所需的结果:

@Qualifier('_halObjectMapper')

编辑:用于呈现关联/嵌套属性

默认情况下,Spring data-rest不呈现关联(引用),因为它们在HATEOAS规范下是可用的(json的< code>_link部分)。如果你想渲染关联,你只需要使用投影。

这个人有几个属性:id是主键,firstName和lastName是数据属性,address是到另一个域对象的链接

@Entity
public class Person {

  @Id @GeneratedValue
  private Long id;
  private String firstName, lastName;

  @OneToOne
  private Address address;
  …
}

将呈现:

   {
  "firstName" : "Frodo",
  "lastName" : "Baggins",
  "_links" : {
    "self" : {
      "href" : "http://localhost:8080/persons/1"
    },
    "address" : {
      "href" : "http://localhost:8080/persons/1/address"
    }
    }
    }

默认情况下,Spring Data REST将导出这个域对象,包括它的所有属性。名字和姓氏将被导出为纯数据对象。关于地址属性有两个选项。一种选择是也为地址定义一个存储库。

还有一条路。如果Address domain对象没有自己的存储库定义,Spring Data REST会将数据字段内联到Person资源中。

 类似资料:
  • 我需要在Spring-boot应用程序中使用默认的ObjectMapper作为单个实例。我是否可以简单地在应用程序内部@autowire ObjectMapper(在Spring-boot应用程序中默认创建的实例)而不创建@bean(因为我不想更改ObjectMapper的任何功能) https://docs.spring.io/spring-boot/docs/current/reference

  • 在我的Spring Boot应用程序中,我使用反应性WebFlux WebClient从SSE(服务器发送事件)终结点检索流式JSON数据。修改默认的自动配置Jackson ObjectMapper行为,通过设置Spring Boot中的配置选项,如,如官方文档所建议的,对WebFlux WebClient没有影响。我还尝试了这个SO线程中概述的其他建议,比如为WebFlux配置创建自定义bean

  • 问题内容: 众所周知,根据JLS7 p.4.12.5, 每个实例变量均使用默认值初始化。例如(1): 但是我一直认为,这样的类实现(2): 绝对等于示例(1)。我期望,复杂的Java编译器会看到(2)中的所有这些初始化值都是多余的,并忽略了它们。 但是突然对于这两个类,我们有两个不同的字节码。 例如(1): 例如(2): 问题是: 为什么?但这是显而易见的要优化的事情。什么原因? UPD: 我使用

  • 请考虑以下陈述: 在这两种情况下,序列化值和将为。默认情况下,Jackson会无一例外地序列化对象。哪些情况下我们需要使用,而不是直接序列化?

  • 问题内容: Node 和ES6 之间有什么区别?我试图弄清楚为什么在Node.js 6.2.2中尝试出现“ __不是构造函数”错误。 什么有效 什么 不 工作 问题答案: 问题是 如何在CommonJS中模拟ES6模块 您如何导入模块 ES6到CommonJS 在撰写本文时,没有环境本地支持ES6模块。在Node.js中使用它们时,您需要使用Babel之类的东西将模块转换为CommonJS。但是那

  • 我正在使用带有Spring Boot(2.3.3版)的H2数据库和H2数据库的所有默认设置。 这是我申请的所有文件。 pom.xml