REST HATEOAS:如何序列化嵌套资源(使用 Spring HATEOAS)?
REST HATEOAS: How to serialize nested resources (with Spring HATEOAS)?
我使用 Spring HATEOAS 在我的应用程序中创建 REST HATEOAS API。到目前为止它运行良好,但是当涉及到嵌套资源时我被卡住了。将这样的 class 层次结构映射到 REST HATEOAS 资源的正确方法是什么:
public class MyEntity {
private int id;
private List<ChildEntity> children;
}
public class ChildEntity {
private int id;
private AnotherEntity entity;
}
public class AnotherEntity {
}
我创建了 Resource classes for all of this entities, but when serialising MyEntity, all contained entities get serialized as POJOs although I need them to be serialized as resources too (with links etc). Is there a way to add a resource to a parent resource (and not using the Resources class)? Or do I have to add a @JsonIgnore to children and then manually add the children as resources in my ResourceAssembler? Wouldnt it then make more sense to use ResourceSupport 而不是资源?
扩展资源支持:
public class MyEntityResource extends ResourceSupport {
private int identificator;
private List<ChildEntityResource> children;
public int getIdentificator() {
return identificator;
}
public void setIdentificator(int id) {
this.identificator = identificator;
}
public List<ChildEntityResource> getChildren() {
return children;
}
public void setChildren(List<ChildEntityResource> children) {
this.children = children;
}
}
public class ChildEntityResource extends ResourceSupport {
private int identificator;
private AnotherEntityResource entity;
public int getIdentificator() {
return identificator;
}
public void setIdentificator(int identificator) {
this.identificator = identificator;
}
public AnotherEntityResource getEntity() {
return entity;
}
public void setEntity(AnotherEntityResource entity) {
this.entity = entity;
}
}
public class AnotherEntityResource extends ResourceSupport {
private String value;
public String getValue() {
return value;
}
public void setValue(String value) {
this.value = value;
}
}
@RestController
public class EntityController {
@RequestMapping(value = "/entity", method = RequestMethod.GET)
public ResponseEntity<MyEntityResource> index() {
AnotherEntityResource anotherEntityResource = new AnotherEntityResource();
anotherEntityResource.add(new Link("link-for-another-entity-resource", "rel-1"));
anotherEntityResource.setValue("value for Another Entity","rel-2");
ChildEntityResource childEntityResource = new ChildEntityResource();
childEntityResource.setIdentificator(20);
childEntityResource.setEntity(anotherEntityResource);
childEntityResource.add(new Link("link-for-child-entity-resource", "rel-3"));
MyEntityResource entityResource = new MyEntityResource();
entityResource.setIdentificator(100);
entityResource.setChildren(Arrays.asList(childEntityResource));
entityResource.add(new Link("link-for-entity-resource"));
return new ResponseEntity<MyEntityResource>(entityResource, HttpStatus.OK);
}
}
@SpringBootApplication
public class Application {
public static void main(String[] args) {
SpringApplication.run(Application.class, args);
}
}
结果是:
{
"identificator": 100,
"children": [
{
"identificator": 20,
"entity": {
"value": "value for Another Entity",
"_links": {
"rel-1": {
"href": "link-for-another-entity-resource"
}
}
},
"_links": {
"rel-2": {
"href": "link-for-child-entity-resource"
}
}
}
],
"_links": {
"rel-3": {
"href": "link-for-entity-resource"
}
}
}
但是你必须考虑这是否是连接不同资源的正确选择。除非您在控制器方法中提供获取此嵌入式资源的方法,否则您将无法单独访问它们。一种解决方案是使用 HAL。使用 HAL,您可以使用 _links 属性 指向资源或将此资源嵌入到 _embedded 属性.
我使用 Spring HATEOAS 在我的应用程序中创建 REST HATEOAS API。到目前为止它运行良好,但是当涉及到嵌套资源时我被卡住了。将这样的 class 层次结构映射到 REST HATEOAS 资源的正确方法是什么:
public class MyEntity {
private int id;
private List<ChildEntity> children;
}
public class ChildEntity {
private int id;
private AnotherEntity entity;
}
public class AnotherEntity {
}
我创建了 Resource classes for all of this entities, but when serialising MyEntity, all contained entities get serialized as POJOs although I need them to be serialized as resources too (with links etc). Is there a way to add a resource to a parent resource (and not using the Resources class)? Or do I have to add a @JsonIgnore to children and then manually add the children as resources in my ResourceAssembler? Wouldnt it then make more sense to use ResourceSupport 而不是资源?
扩展资源支持:
public class MyEntityResource extends ResourceSupport {
private int identificator;
private List<ChildEntityResource> children;
public int getIdentificator() {
return identificator;
}
public void setIdentificator(int id) {
this.identificator = identificator;
}
public List<ChildEntityResource> getChildren() {
return children;
}
public void setChildren(List<ChildEntityResource> children) {
this.children = children;
}
}
public class ChildEntityResource extends ResourceSupport {
private int identificator;
private AnotherEntityResource entity;
public int getIdentificator() {
return identificator;
}
public void setIdentificator(int identificator) {
this.identificator = identificator;
}
public AnotherEntityResource getEntity() {
return entity;
}
public void setEntity(AnotherEntityResource entity) {
this.entity = entity;
}
}
public class AnotherEntityResource extends ResourceSupport {
private String value;
public String getValue() {
return value;
}
public void setValue(String value) {
this.value = value;
}
}
@RestController
public class EntityController {
@RequestMapping(value = "/entity", method = RequestMethod.GET)
public ResponseEntity<MyEntityResource> index() {
AnotherEntityResource anotherEntityResource = new AnotherEntityResource();
anotherEntityResource.add(new Link("link-for-another-entity-resource", "rel-1"));
anotherEntityResource.setValue("value for Another Entity","rel-2");
ChildEntityResource childEntityResource = new ChildEntityResource();
childEntityResource.setIdentificator(20);
childEntityResource.setEntity(anotherEntityResource);
childEntityResource.add(new Link("link-for-child-entity-resource", "rel-3"));
MyEntityResource entityResource = new MyEntityResource();
entityResource.setIdentificator(100);
entityResource.setChildren(Arrays.asList(childEntityResource));
entityResource.add(new Link("link-for-entity-resource"));
return new ResponseEntity<MyEntityResource>(entityResource, HttpStatus.OK);
}
}
@SpringBootApplication
public class Application {
public static void main(String[] args) {
SpringApplication.run(Application.class, args);
}
}
结果是:
{
"identificator": 100,
"children": [
{
"identificator": 20,
"entity": {
"value": "value for Another Entity",
"_links": {
"rel-1": {
"href": "link-for-another-entity-resource"
}
}
},
"_links": {
"rel-2": {
"href": "link-for-child-entity-resource"
}
}
}
],
"_links": {
"rel-3": {
"href": "link-for-entity-resource"
}
}
}
但是你必须考虑这是否是连接不同资源的正确选择。除非您在控制器方法中提供获取此嵌入式资源的方法,否则您将无法单独访问它们。一种解决方案是使用 HAL。使用 HAL,您可以使用 _links 属性 指向资源或将此资源嵌入到 _embedded 属性.