【发布时间】:2021-06-04 11:54:42
【问题描述】:
在我们的架构指南中,我们应该只从域模型或存储库实现(位于基础架构层)中实例化业务异常
我们通常使用工厂方法创建异常。
所以我想为此制定一个 ArchUnit 规则。应该遵循以下原则:
只有位于domain 或Repositories 的实现的类才能大声调用带有@BusinessException 注释的类的静态方法
我们所有的业务异常都使用@BusinessException 进行注释。所以很容易找到它们。
我尝试了它的变体:
noClasses().that().resideOutsideOfPackages(DOMAIN).or(areImplementing(Repository.class))
.should().callMethodWhere(
target(owner(isAnnotatedWith(BusinessException.class)))
.and(target(modifier(JavaModifier.STATIC))));
areImplementing() 是一个自定义谓词,用于确定一个类是否是存储库的实现。
此代码无法编译。 isAnnotatedWith不能这样用。
我也尝试过
methods().that().areStatic()
.and().areDeclaredInClassesThat().areAnnotatedWith(BusinessException.class)
.should().onlyBeCalled().byClassesThat(areImplementing(Repository.class))
同样,这不会编译,onlyBeCalled 不存在。
有人有想法吗?
【问题讨论】: