我的情况是我有一个干净的域模型。通过清洁,我的意思是它只是一个私人财产和吸气剂和制定者的集合。我想这就是贫血数据模型的含义。
此模型可与其他应用程序互换(可与其他应用程序代码共享),而不会产生额外的依赖关系。
此模型需要序列化为不同的数据格式。为此,我可以使用各种注释来大大简化我的生活。
只有他们在将共享域模型的所有项目中引入一组额外的依赖项。 我已经读过,因为这样的原因,不建议混淆域模型,我可能会在Jar Hell中着陆。
我可以编写一个带注释的包装器,并在构造函数中传入域模型,并将所有属性复制到带注释的模型。这样我就可以愉快地使用注释,同时保持一个不会强制执行任何额外依赖的干净域模型。
这不是专门关于序列化您的数据模型,而是关于在您的域模型中添加额外的功能(例如通过注释)来强制执行新的依赖项。
你如何处理这些用例,在不必担心Jar Hell的情况下处理这个问题的安全方法是什么?
答案 0 :(得分:2)
您只需在编译时使用注释。 如果注释类在运行时不可用,则它们将不存在。
E.g。如果客户端代码在a上调用AnnotatedElement.getAnnotations() 域模型类及其编译的注释在类路径中不可用,它们不会被返回。
如果您使用maven,则应声明注释依赖项,并使用scope可选。 可选的依赖项不会包含在客户端中。 因此,只有在客户声明它们时才可以使用它们。
例如:
如果Proj-A在Proj-B上有可选的依赖关系(? - >)
Proj-A ?-> Proj-B
并且Proj-X将Proj-A作为编译依赖项引用它将不会获得可选的依赖项Proj-B。
Proj-X -> Proj-A
因为传递依赖性解析以可选的依赖关系结束。
预计在名为annotations.jar
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.TYPE)
public @interface ARuntimeAnnotation {
}
您在model.jar
@ARuntimeAnnotation
public class Model {
}
并且model.jar
与annotations.jar
有依赖关系,因为它需要编译。
<depdendency>
<groupId>someGroup</groupId>
<artifactId>annotations</artifactId>
<scope>optional</scope>
</dependency>
如果此依赖项是可选的,则它不会自动成为某人的传递依赖关系,只会依赖model.jar
。
现在客户想要使用Model
类。因此它依赖于model.jar
。
<depdendency>
<groupId>someGroup</groupId>
<artifactId>model</artifactId>
</dependency>
如果客户端还想查看注释ARuntimeAnnotation
,则还必须包含注释
annotations.jar作为依赖项,因为它是可选的。
如果客户端不包含对annotations.jar的依赖,则以下调用将返回一个空数组:
Model.class.getAnnotations(); // will be empty if the annotations.jar is not available at runtime