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

在spring data rest中处理自定义POST、PUT和补丁请求中的关联条目

施凡
2023-03-14

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

@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的默认实现可以优雅地处理这一点,但我面临杰克逊映射错误。

JSON解析错误:无法构造'com.foo.bar.Entity'的实例(尽管至少存在一个Creator):没有字符串参数构造函数/工厂方法从字符串值反序列化('/api/v1/body/12345678-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)

我还发现,<code>PersistentEntityResource有效负载</code>由获取的关联实体填充,主实体通过对存储库的正常保存调用保存。

因此,我尝试自动连接< code > PersistentEntityResource ,但这基本上失败了,因为< code > PersistentEntityResource 的调用程序希望映射url的形式为< code>/{repository}/

有什么办法处理这个问题吗?

共有1个答案

平山
2023-03-14

经过一番挖掘,我找到了答案。事后看来,这是相当微不足道的。只需使用<代码>资源

@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()
    }
}

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

 类似资料:
  • 我刚刚开始从我现有的网络库移植到Android的Volley。到目前为止,我已经成功地实现了适用的Volleys ImageLoader。现在,我试图让我的第一个超文本传输协议调用和运行,但我发现这个错误。 注意:我有意以补丁请求开始,因为我将经常使用它们。另外,我的版本Volley也支持补丁:https://android.googlesource.com/platform/frameworks

  • 因此,我有以下内容,这似乎令人难以置信的骇客,我一直在想,Go有比这更好的设计库,但我找不到Go处理JSON数据POST请求的例子。它们都是表格帖子。 下面是一个示例请求: 下面是嵌入日志的代码: 肯定有更好的办法,对吧?我只是很难找到最好的做法。 对搜索引擎来说,Go也被称为Golang,这里提到了它,这样其他人就可以找到它。)

  • 正如我们所知,在SpringDataRest中,存储库文件只被使用(而不是控制器),我们可以为它使用内置方法。 我不想添加自定义方法,并在那里添加我的请求处理逻辑。我想要一些配置或事件重写,在这里我可以处理HttpRequest处理程序,解析令牌并检查令牌中的一些数据,根据该令牌,我将决定要么处理该请求,要么放弃它,但出现一些错误。 谢了。

  • 在我的spring-boot服务中,我使用https://github.com/java-json-tools/json-patch用于处理PATCH请求。 一切似乎都很好,除了一种避免修改不可变字段的方法,如对象ID、creation_time等。我在Github上发现了一个类似的问题https://github.com/java-json-tools/json-patch/issues/21我

  • 问题内容: 我正在使用djang-tastypie作为后端和AngularJs作为前端的API。我正在使用angularjs $ http从CRUD发送请求。GET,POST,PUT一切都很好,但是当我尝试发送PATCH请求时,出现错误,未定义PATCH方法。我已经在angular中创建了一个api调用工厂,但是PATCH请求在那里不起作用。 这是我的HTML代码 当我在控制台中使用此代码发送路径

  • 如何在Laravel中验证补丁/放置请求 根据Laravel留档http://laravel.com/docs/5.1/controllers,请求由资源控制器的操作处理 由于请求应更新部分资源并将更新整个资源,因此我的 验证应如下所示: 我应该这样做吗 依靠您的专业答案。