【问题标题】:Is there 'projections' in Spring Data Rest for paremeters?Spring Data Rest 中是否有参数的“投影”?
【发布时间】:2019-11-09 05:13:23
【问题描述】:

SDR 中的投影非常适合控制 json 输出。但是 REST 调用中的输入和参数呢?

当我实现自己的控制器时,我能够通过任一方式为输入(创建/更新)处理自定义“投影”

  1. 创建与完整实体不同的自定义 DTO
  2. 或者我可以只使用@JsonView 并在途中省略某些字段

这两种方法都不适用于 SDR,因为您不编写控制器。这样做的方法是什么?

【问题讨论】:

  • 我有一种不好的感觉,这是一个 XY 问题。原来的问题是什么?为什么需要这个功能?
  • 什么意思?假设我只想让客户端更新实体的 5 个字段中的 3 个。您如何在 SDR 中表示这一点?
  • @JsonProperty(access = Access.READ_ONLY)添加到其他两个字段,并拒绝PUT请求。所以当客户端发送 PATCH 请求时,这两个字段将被忽略
  • 不是只读字段。您可以在创建时写入但不能更新。
  • 在这种情况下,解决方案会更混乱,但仍然比创建“投影”更容易。我会尽快添加答案

标签: java spring-boot spring-data-rest


【解决方案1】:

反思评论部分讨论的问题:

给实体添加@Postload方法:

@PostLoad
public void postLoad() {
    ... store the values of the un-updateable fields into transient fields with @JsonIgnore
}

@JsonIgnore
@Transient
private String originalValue1;

@JsonIgnore
@Transient
private String originalValue2;

创建一个@HandleBeforeSave 事件处理程序。它在更新期间调用,但不是在创建期间调用。

将存储的值复制到此处理程序中的原始字段。

  • 在创建过程中不会调用事件处理程序,所有字段都可以通过标准 SDR 端点设置。
  • 在更新过程中,在保存之前用它们的原始值覆盖更改的值,因此当实体被保存时,它将保留原始值。

【讨论】:

  • 我想这行得通,但这是一个丑陋的黑客。一方面,这会对在写入之前读取值造成不必要的性能损失。为什么 SDR 不能让您指定您接受的内容?
  • 我有个坏消息要告诉你:SDR 总是先读取值再写入 :)
  • 还不错,但要严肃一点。真的没有办法做到这一点吗?我想您可以覆盖自定义控制器(如更新)中的特定 REST 调用并使其接受 DTO?
猜你喜欢
  • 2016-01-20
  • 2016-03-23
  • 2017-07-27
  • 2018-04-18
  • 1970-01-01
  • 2015-05-01
  • 1970-01-01
  • 1970-01-01
  • 2015-02-05
相关资源
最近更新 更多