我有一个接收JSON消息的应用程序,然后将其反序列化为POJO。我已经研究了几周的洋葱建筑,我偶然发现了这种情况下的一个长期困境。由于我使用Jackson Deserializer,我被迫使用Jackson Annotations来协助反序列化过程。应用程序核心需要这个Jackson POJO,这就是问题所在。由于反序列化是基础设施问题,因此在我的核心中使用带有Jackson注释的类是不正确的,对吗?
我看到两个选项:
1 - 我的核心将有一个类似于Jackson POJO的POJO,但没有注释。杰克逊POJO将在基础设施中,然后我将使用映射框架将杰克逊POJO映射到域POJO。
基础架构层中的POJO:
public class MyUser {
private String firstName;
private String lastName;
@JsonProperty("first_name")
public String getFirstName() {
return firstName;
}
public void setFirstName(String firstName) {
this.firstName = firstName;
}
@JsonProperty("last_name")
public String getLastName() {
return lastName;
}
public void setLastName(String lastName) {
this.lastName = lastName;
}
}
核心层中的POJO:
public class MyUser {
private String firstName;
private String lastName;
public String getFirstName() {
return firstName;
}
public void setFirstName(String firstName) {
this.firstName = firstName;
}
public String getLastName() {
return lastName;
}
public void setLastName(String lastName) {
this.lastName = lastName;
}
}
2 - 假设杰克逊是横切的,因此可以通过各层使用。
我认为,考虑到我正在关注洋葱架构,选项1更合适。但是,坚持使用此选项将迫使我复制对象,这对我来说听起来不太好。
真的只有这两种选择吗?有什么建议吗?
答案 0 :(得分:1)
如果您需要,您的解决方案是 数据传输对象设计模式 或 DTO 的众所周知的解决方案了解更多相关信息。
在我看来,这些不是对象重复。它们是相同域概念的不同表示,每个都适应特定应用层的需要。因为每种模式都有强制要求使用它们的时候,有些时候它是无用的,而且比任何东西都更具破坏性。
根据我自己的经验讲述的故事:我们有一个项目,我们选择为每一层使用相同的POJO以避免重复并且必须处理映射。几个星期后,我们遇到了一些我们“被砍掉”的小问题。
稍后,这些问题变得更加严重(性能,API层中的数据库问题......)以及最难修复的问题。在经历了很多头痛之后,我们同意映射和POJO重复是有道理的。
但相反的情况也可能发生:您可以使用简单的CRUD应用程序进行严格的分层,只需很少的逻辑。然后严格的分层架构浪费时间和精力。
通常答案是:这取决于你想要建立什么。 应用程序越大越复杂(可扩展性在这里是一个真正的问题),架构必须越严格。但是一个简单的应用程序(或更大结构的任何简单节点)需要保持简单。
希望它有所帮助!