【问题标题】:Spring Hateoas - REST clients need have model classes + resource classesSpring Hateoas - REST 客户端需要有模型类 + 资源类
【发布时间】:2014-04-22 08:43:33
【问题描述】:

我们已经使用Spring Hateoas project 实现了一个 RESTful Web 服务。该项目使您可以轻松地将您的域类转换为提供“自我”链接等的资源。

我发现这种方法令人困惑的是,您在使用 GET 时返回资源类,但在执行 POST 或 PUT 时,您使用域模型。这意味着任何使用 RESTful API 的客户端都需要访问域类 + 资源类(导致客户端必须添加 Hateoas 项目作为依赖项)。这种方法可以在this blog entry看到。

这里的正确方法是什么?只使用资源类(也适用于 POST 和 PUT)?

并非每个域类都有匹配的资源。以对象图更复杂且资源具有子对象列表的情况为例:

public class StoreResource {
    public String name;
    public List<Location> children;
}

Location 对象没有任何资源类。

目前看来,我们需要同时向客户端提供域类和现有资源类。

【问题讨论】:

    标签: java spring hateoas


    【解决方案1】:

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

    通用接口示例:

    package com.example.cookbook.model;
    
    interface RecipeDetails {
      String getTitle();
      List<? extends IngredientExcerpt> getIngredients();
    }
    

    服务器实体示例:

    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
    }
    

    客户端资源示例:

    package com.example.cookbook.client.model;
    
    public class RecipeDetailsResource extends ResourceSupport implements RecipeDetails {
      private List<IngredientExcerptResource> ingredients;
      private String title;
      ... // Getters, setters
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-12-03
      • 1970-01-01
      • 1970-01-01
      • 2016-05-06
      • 1970-01-01
      • 2019-03-31
      • 2014-09-05
      • 1970-01-01
      相关资源
      最近更新 更多