Spring Hateoas - REST客户端需要模型类+资源类

Jos*_*osé 5 java spring hateoas

我们使用Spring Hateoas项目实现了RESTful Web服务.此项目可以轻松地将您的域类转换为提供"自我"链接等的资源.

我觉得这种方法令人困惑的是你在使用GET时返回资源类,但是当你做POST或PUT时你会使用域模型.这意味着使用RESTful API的任何客户端都需要访问域类+资源类(导致客户端必须将Hateoas项目添加为依赖项).这种方法可以在这篇博客文章中看到.

这里的正确方法是什么?仅用于资源类(对于POST和PUT)?

并非每个域类都有匹配的资源.假设对象图更复杂并且资源具有子对象列表:

public class StoreResource {
    public String name;
    public List<Location> children;
}
Run Code Online (Sandbox Code Playgroud)

Location对象没有任何资源类.

现在看起来我们需要向客户端提供域类+现有资源类.

aux*_*aux 0

在我们的项目中,我们使用类似的方法。是的,在这种情况下,客户端库确实有 Spring HATEOAS 作为依赖项。例如,我们将领域模型共享为一组接口。服务器实体和客户端资源都实现这些接口以保持一致性。

通用接口示例:

package com.example.cookbook.model;

interface RecipeDetails {
  String getTitle();
  List<? extends IngredientExcerpt> getIngredients();
}
Run Code Online (Sandbox Code Playgroud)

服务器实体示例:

package com.example.cookbook.server.model;

@Entity
public class Recipe implements AbstractPersistable<Long> {

  /**
   * Recipe details projection.
   */
  @Projection(name="details", classes=RecipeEntity.class)
  public interface RecipeDetailsProjection extends RecipeDetails {
    @Override
    List<IngredientExcerptProjection> getIngredients();
  }

  private List<Ingredient> ingredients;
  private String title;
  ... // getters, setters
}
Run Code Online (Sandbox Code Playgroud)

客户资源示例:

package com.example.cookbook.client.model;

public class RecipeDetailsResource extends ResourceSupport implements RecipeDetails {
  private List<IngredientExcerptResource> ingredients;
  private String title;
  ... // Getters, setters
}
Run Code Online (Sandbox Code Playgroud)