好的做法? REST中用于创建和获取资源的一个或两个对象模型

时间:2016-10-13 13:44:05

标签: java rest jax-rs

假设

我们必须创建用于管理用户的REST层。

对我们来说,自然而然就是创造两种方法:

  • 用于创建用户(或注册用户)

  • 获取用户。

我们从第一个开始,首先关注定义用户模型:名字,姓氏,年龄,国家,语言等。

到目前为止一切顺利。接下来是获取用户详细信息的方法:名字,姓氏,年龄,国家,语言以及在用户注册期间设置的整箱其他值:id,用户所属的默认组,可能是角色(管理员,主持人?),用户注册时的日期时间等等。

我们会在一个类(用户模型)中设置有关用户的信息,但是为这些内部元素设置约束呢? 例如:在两种情况下都需要和定义名字或姓氏(创建和获取),没关系,但是用户ID?在'create user'方法中不需要它(即使是禁止的)但是get方法应该有这个字段。

最简单的方法是将用户模型拆分为两个类:UserBase包含所有必填字段(用于注册),User扩展UserBase用于其他情况。

这只是基于资源实现良好的REST服务的要求:创建新资源(用户):POST ../users 获取资源(用户):GET ../ users / {id}

处理此问题的最佳做法是什么?

2 个答案:

答案 0 :(得分:1)

我已经回答了类似的问题here。为REST API提供专用的模型类将为您提供更长的灵活性,并带来一些好处。提一下:

  • 它会阻止您暴露不应该出现的字段。
  • 您可以完全控制在创建或更新资源时收到的属性。
  • 管理多个版本的API时,它会很方便。

可以避免将持久性模型映射到REST API模型的样板代码:可以使用many mapping frameworks来实现此目的。例如,看看MapStruct,它是基于注释的,并作为Maven注释处理器。

另请考虑Lombok为您生成getter,setter,equals()hashcode()toString()方法。

答案 1 :(得分:0)

对于复杂的应用程序,我倾向于创建一个包含用户所需内容的User类,然后添加一个与User相关的新层,该层只包含该类操作所需的数据。

我称这个新的类DTO层。

然后我有一个第三方库,其作用类似于User和DTO对象之间的模型映射器。我使用ModelMapper获得了很好的经验。

例如,如果我有一个Order类作为模型层中的主类,而另一个类OrderDTO只显示特定操作所需的信息,则映射的工作方式如下:

// Assume getters and setters on each class
class Order {
  Customer customer;
  Address billingAddress;
}

class Customer {
  Name name;
}

class Name {
  String firstName;
  String lastName;
}

class Address {
  String street;
  String city;
}

和OrderDTO:

// Assume getters and setters
class OrderDTO {
  String customerFirstName;
  String customerLastName;
  String billingStreet;
  String billingCity;
}

要玩这两个我只需要:

ModelMapper modelMapper = new ModelMapper();
OrderDTO orderDTO = modelMapper.map(order, OrderDTO.class);

并非所有人都喜欢DTO方法,但我认为这是最灵活的做事方式,尤其是在应用程序变得复杂的情况下。

现在,关于验证。我倾向于使用javax.validation.constraints中的注释来注释User类,并验证BindingResult是否存在任何错误。