java - 在 Spring Data Rest 中处理自定义 POST PUT 和 PATCH 请求中的关联条目

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

我有一个要求,其中必须在 POST、PATCH 和 PUT 端点中具有自定义业务逻辑。不可能使用 SDR 事件,因为我需要在请求中执行一些事务操作。因此,我决定为通过服务类附加到存储库的实体创建自定义端点。

@RepositoryRestController
@RequestMapping("/myEntity")
@ExposesResourceFor(MyEntity.class)
public class MyEntityResource {
    @PostMapping(value = "", produces = MediaTypes.HAL_JSON_VALUE)
    public ResponseEntity postResult(@RequestBody Entity entity) {
        // my logic
    }
}

现在我面临一个问题,我的 POST 请求可能具有指向其他实体的关联链接。 SDR 的默认实现可以很好地处理这个问题,但我遇到了 Jackson 映射错误。

JSON parse error: Cannot construct instance of `com.foo.bar.Entity` (although at least one Creator exists): no String-argument constructor/factory method to deserialize from String value ('/api/v1/entity/12345678-1234-1234-1234-123456789012')

于是我查了一下Spring的实现方式,发现了下面的方法

@ResponseBody
@RequestMapping(value = BASE_MAPPING, method = RequestMethod.POST)
public ResponseEntity<ResourceSupport> postCollectionResource(RootResourceInformation resourceInformation,
        PersistentEntityResource payload, PersistentEntityResourceAssembler assembler,
        @RequestHeader(value = ACCEPT_HEADER, required = false) String acceptHeader)

我发现 PersistentEntityResource payload 中填充了获取的关联实体,并且主实体通过对存储库的正常保存调用进行保存。

因此,我尝试 Autowiring PersistentEntityResource 但本质上失败了,因为 PersistentEntityResource 的调用者期望映射 url 的形式为 /{repository}/<optional id> 并且由于我已经知道我的路径是什么,PersistentEntityResource 无法初始化。 PersistentEntityResource 不是通用的也无济于事(它达到了 SDR 2.0.0.M1,之后被删除)。另外,能够使用 PersistentEntityResource 也会使 PATCH 和 PUT 的实现变得更加容易。

有什么办法可以解决这个问题吗?

最佳答案

经过一番挖掘,我找到了答案。事后看来,这是非常微不足道的。只需使用 Resource<Entity>而不是Entity在方法参数中。

@RepositoryRestController
@RequestMapping("/myEntity")
@ExposesResourceFor(MyEntity.class)
public class MyEntityResource {
    @PostMapping(value = "", produces = MediaTypes.HAL_JSON_VALUE)
    public ResponseEntity postResult(@RequestBody Resource<Entity> entity) {
        // my logic. Fetch the entity with entity.getContent()
    }
}

您可以使用 entity.getContent() 获取实体本身

关于java - 在 Spring Data Rest 中处理自定义 POST PUT 和 PATCH 请求中的关联条目,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58590631/

相关文章:

java - Spring MVC Portlet : form not saving data correctly

java - Android、Spring 和 Json 一般问题?

java - 测试 Spring Boot 中使用的 HSQLDB 连接

java - Spring Boot应用程序中所有请求的超时异常

java - 使用 Maven Assembly 插件合并 META-INF/services 文件

java - 如何在 MYBatis 2 中为带有参数类映射的 SQL Update 或 SQL Select 语句创建 SQL In 子句

java - Spring WebSockets @SubscribeMapping 中的 PathVariables 不起作用

java - Spring + hibernate + HikariCP : how to handle DB connection while doing long running REST call?

java - 线程不工作

java - JSch 多个隧道/跳跃站