在没有存储库的情况下使用CRNK

时间:2019-10-04 21:18:00

标签: spring-boot json-api crnk

但是,我们已经标准化了将JSON:API用于我们的REST端点。并非我们所有的数据都围绕存储库,并且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"
    }
}

谢谢!

3 个答案:

答案 0 :(得分:0)

我遇到了类似的问题,问题是我的依赖项中有io.crnk:crnk-format-plain-json(从示例应用程序简单复制),这改变了响应的外观(非JSON-API)。因此,首先查看您的Maven / gradle配置。

答案 1 :(得分:0)

  

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

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

Crnk本身不需要控制器,就像Spring MVC一样。 Crnk会自行处理这种“低级管道”,因为JSON:API指定了REST层的外观。因此,无需像上面的MVC示例中那样编写自定义代码来指定url模式,参数等。相反,可以实现一个存储库:

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

  ...

}

还有很多内置的defult存储库实现,例如用于内存,JPA,安全性以覆盖最常见的用例。

答案 2 :(得分: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,它将给出所需的输出。请记住,将内容类型设置为application / vnd.api + json。

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

相关问题