映射外部资源-验证POST关系

时间:2019-04-02 14:05:15

标签: spring-data-rest

如果有2个基于spring数据休息的服务(A和B),其中实体B引用了一个实体A,那么当实体B被其他服务发布到POST时,如何验证存在性或其他条件?

我试图稍微了解一下spring数据休息和微服务,因此用spring boot和spring数据休息构建了两个rest api服务-“可跟踪服务”和“ datapoint服务”。数据点服务中的实体引用可跟踪服务中的实体。我找到了一个很好的示例,使用资源处理器将数据点中可跟踪对象的ID转换为URL,并在呈现资源之前将链接附加到资源。现在,我想在创建数据点时验证可追踪性的存在。这是我被困住的地方,到目前为止还没有找到太多信息。也许我只是无法这样识别它;)

可跟踪服务: http://localhost:8180

数据点服务: http://localhost:8181

DataPoint.java

public class DataPoint<T> {

    @Id @GeneratedValue
    private Long id;

    @NotNull
    @RestResourceMapper(context = RestResourceContext.TRACKABLES, path = "/trackables/#id")
    @JsonProperty(access = Access.WRITE_ONLY)
    private Long trackable;

}
$ curl http://localhost:8181/dataPoints/2
{
  "createdDate" : null,
  "modifiedDate" : null,
  "timestamp" : "2019-04-02T15:03:14.359",
  "type" : "double",
  "value" : 399.0,
  "unit" : "EUR_CENT",
  "_links" : {
    "self" : {
      "href" : "http://localhost:8181/doubleDataPoints/2"
    },
    "doubleDataPoint" : {
      "href" : "http://localhost:8181/doubleDataPoints/2"
    },
    "trackable" : {
      "href" : "http://localhost:8180/trackables/23"
    }
  }
}

我实现了这一点,我遵循了https://github.com/SteveConnelly/spring-data-rest-external-resource-mapping中给出的示例,并在此处和此处进行了一些调整。通常,它为所有实体类型注册一个ResourceProcessor,并尝试查找带有自定义注释的字段,以指示该字段实际上是外部资源的标识符。然后,它会构建链接并将其附加到资源中。

我添加了@JsonProperty(access = Access.WRITE_ONLY),因为我不想将其呈现为DataPoint实体的属性。

我现在所缺少的是一种使POST DataPoint像这样工作的方式:

$ cat datapoint.json
{
  "timestamp" : "2019-04-02T14:52:06.64",
  "type" : "double",
  "value" : 399.0,
  "unit" : "EUR_CENT",
  "trackable": "http://localhost:8180/trackables/23"
}
$ curl -X POST -d @datapoint.json -H "Content-type: application/json" http://localhost:8181/dataPoints

并非意外,错误消息显示为

Caused by: com.fasterxml.jackson.databind.exc.InvalidFormatException: Cannot deserialize value of type `java.lang.Long` from String "http://localhost:8180/trackables/23": not a valid Long value

所以我想做的是: 1.拦截POST请求 2.获取“ trackable”属性随附的URL,然后通过向该URL发送GET请求来遵循该URL 3.如果响应为200,则提取ID并将其设置为DataPoint中“ trackable”属性的值。否则引发异常

我缺少适合这项工作的机制。有人可以指出方向吗?我没有在此在线上找到大量的教程,这真是很奇怪,因为我认为这是人们经常遇到的问题。

0 个答案:

没有答案