我有一个要求,我必须在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
被获取的关联实体填充,并且主要实体通过对存储库的常规保存调用而被保存。
所以,我尝试自动装配PersistentEntityResource
,但失败的主要原因是,PersistentEntityResource
的调用者期望映射URL的格式为/{repository}/<optional id>
,并且正如我已经知道我的路径是什么,PersistentEntityResource
无法初始化。 PersistentEntityResource
不是通用的也无济于事(直到SDR 2.0.0.M1才被删除)。同样能够使用PersistentEntityResource
也将使PATCH和PUT的实现变得容易得多。
有没有办法解决这个问题?
我有一个要求,我必须在POST,PATCH和PUT端点中具有自定义业务逻辑。使用SDR事件是不可能的,因为我需要做一些事务处理...
经过一番挖掘,我找到了答案。事后看来,这是微不足道的。只需在方法参数中使用Resource<Entity>
而不是Entity
。