在我们的架构指南中,我们应该只从域模型或存储库实现(位于基础设施层)中实例化业务异常
我们通常使用工厂方法创建异常。
所以我想为此制定一个 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
不存在。
有人有想法吗?