4 回答
TA贡献1830条经验 获得超3个赞
如果两个 REST 端点必须返回相同的报告但公开不同数量的信息,那么您可能会发现@JsonView它很有用。
这是示例http://rsdn.org/forum/flame.politics/7430262
public class Views {
public static class Public {
}
public static class Internal extends Public {
}
}
public class Item {
@JsonView(Views.Public.class)
public int id;
@JsonView(Views.Public.class)
public String itemName;
@JsonView(Views.Internal.class)
public String ownerName;
}
@JsonView(Views.Public.class)
@RequestMapping("/items/{id}")
public Item getItemPublic(@PathVariable int id) {
return ItemManager.getById(id);
}
@JsonView(Views.Internal.class)
@RequestMapping("/items/internal/{id}")
public Item getItemInternal(@PathVariable int id) {
return ItemManager.getById(id);
}
TA贡献1851条经验 获得超3个赞
我从“领域驱动设计”中学到的东西:不要试图找到一个“银弹”模型。总是有不同的方式来表达你的概念。模型总是依赖于上下文。
在这里,您report
的存储方式是一种表示形式。您的 REST 客户端想要读取它的方式是另一种表示。您可以想象每个用例都有一个表示。
在这种情况下,我不会为每个应用层之间或域有界上下文之间的映射编码经济。
另外,我会避免继承,如有必要,更喜欢一些接口,接受一些代码冗余。
TA贡献1810条经验 获得超4个赞
通常在应用程序的不同层之间存在对象分离,这意味着您可以拥有一个直接映射到数据库的 Report 对象,但还有一组用于与客户端通信的不同对象,您还可以拥有第三个对象一组对象,您的业务对象,它将包含与您的应用程序相关的逻辑。请注意,您将需要维护在这些对象之间转换的逻辑,可能是构建器模式或类似的东西。作为一个小例子,让我们考虑您的情况,您可以:
报告:类与数据库的 1 对 1 映射,便于保存和检索对象
ReportDAO:包含与 Report 相同的字段,但具有应用程序在处理这些报告时可能使用的附加功能(现在想不出任何东西)
ReportDTO/ExtendedReportDTO:您可以拥有多个继承或不继承的类,这些类将仅包含字段 + getter/setter,并用于与客户端进行通信。
现在使用这个简单的示例可能并不明显,但是分离您的对象将使以后扩展和修改您的应用程序变得更加容易。目前,您可能在所有级别都拥有相同的信息,但稍后可能会发生变化,而且最好不要公开您的业务对象,因此如果您在应用程序中使用 Report 类,则共享不是一个好主意例如,它在 API 中。所以我想说你可以在这里使用继承,但至少对我来说,我认为在应用程序和数据库级别拥有这些相同的对象不是一个好主意。
添加回答
举报