我有一个要求,我必须在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的实现变得容易得多。有什么办法可以解决这个问题?
最佳答案
经过一番挖掘,我找到了答案。事后看来,这是微不足道的。只需在方法参数中使用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()
获取实体本身