0

然而,我们已经标准化为我们的 REST 端点使用 JSON:API;并非我们所有的数据都围绕存储库展开,似乎 CRNK 需要存储库才能工作。

那是对的吗?

例子

我写了一个非常简单的 Spring Boot 2.1.9 示例,它有一个控制器并在其中包含 CRNK,但是当我进入我的控制器时,我没有得到预期的 JSON:API 输出。

请记住,我刚刚开始研究 CRNK,这只是我正在测试的一个简单的“hello world”类型的应用程序

这是我的例子

package com.example.crnkdemo;

import org.springframework.web.bind.annotation.*;

@RestController
@RequestMapping("/test/v1.0")
public class Controller {
    @GetMapping(value = "/{country}", produces = "application/vnd.api+json")
    public Country test1(@PathVariable String country, @RequestParam(name = "filter[region]", required = false) String filter) {
        return new Country(country, filter);
    }
}

Country 只是我创建的一个虚拟类,它是:

package com.example.crnkdemo;

import io.crnk.core.resource.annotations.JsonApiId;
import io.crnk.core.resource.annotations.JsonApiResource;

@JsonApiResource(type = "country")
@AllArgsConstructor
@Data
public class Country {

    @JsonApiId
    private String country;
    private String region;

结果

但是当我使用以下 URL http://localhost:8080/test/v1.0/US?filter[region]=northeast我得到

{
    "country": "US",
    "region":"northeast"
}

我本来期望 JSON API 类型的结果

{
  "data": {
    "type": "country",
    "id": "US",
    "attributes": {
      "region": "northeast"
    }
}

谢谢!

4

3 回答 3

0

“并非我们所有的数据都围绕存储库”

你也可以看看http://www.crnk.io/releases/stable/documentation/#_architecture其中更详细地讨论了 Crnk 和 JSON:API 等面向资源的框架的架构。原则上,可以将所有内容建模为存储库。应用程序通常遵循两种模式:CRUD 模式和“动作”。CRUD 很简单:GET、POST、PATCH、DELETE 对象。存储库是完美的匹配。相比之下,人们在“行动”方面则比较困难。但这可以像 CRUD 一样被建模。例如,发布 AddressChange 资源可能会触发服务器开始修改某些对象的地址。这可能会立即发生或需要更长的时间。对已发布资源的后续 GET 请求将显示操作的当前状态。并且 DELETE 请求可以取消请求。

Crnk 本身并不像 Spring MVC 那样需要控制器。这种“低级管道”由 Crnk 自己负责,因为 JSON:API 指定了 REST 层的外观。所以不需要像上面的 MVC 示例那样编写自定义代码来指定 urls 模式、参数等。相反,可以实现一个存储库:

public class TaskRepositoryImpl extends ResourceRepositoryBase<Task, Long>  {

  private ConcurrentHashMap<Long, Task> tasks = new Concurrent...

  public TaskRepositoryImpl() {
    super(Task.class);
  }


  @Override
  public <S extends Task> S create(S entity) {
    map.put(entity.getId(), entity);
    return entity;
  }


  @Override
  public ResourceList<Task> findAll(QuerySpec querySpec) {
    return querySpec.apply(tasks.values());
  }

  ...

}

还有许多内置的默认存储库实现,例如内存、JPA、安全性,以涵盖最常见的用例。

于 2019-12-11T19:52:49.010 回答
0

我遇到了类似的问题,问题是我进入io.crnk:crnk-format-plain-json了我的依赖项(简单地从示例应用程序复制),这改变了响应的方式(非 JSON-API)。所以首先看看你的 maven/gradle 配置。

于 2019-11-06T14:13:58.430 回答
0

使用 crnk,无需编写控制器、管理器类。默认情况下,控制器已定义。一旦我们定义了资源,我们就可以通过http://server_name:portno/crnk-path-prefix-property/defined_resourcename和方法类型来访问它

例如。在我们的例子中,资源是国家,假设服务器运行在 localhost:8081 并且 crnk-path-prefix 是 /api/v1,那么 url 是http://localhost:8081/api/v1/country & 设置方法类型是 GET,它将给出所需的输出。记得将 content-type 设置为 application/vnd.api+json。

对于 POST,与 POST 相同的 url 和设置方法类型,传递数据对象对于 PATCH,相同的 url 以及附加到 url 的 id 属性,并将方法类型设置为 PATCH 并传递数据对象

于 2020-06-03T13:42:31.247 回答