但是,我们已经标准化了将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"
}
}
谢谢!
答案 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并传递数据对象