gpt4 book ai didi

java - 如何防止某些包在 ArchUnit 中使用 spring?

转载 作者:行者123 更新时间:2023-11-30 05:51:41 24 4
gpt4 key购买 nike

如果我想使某个 Java 包免受 ArchUnit 的第 3 方依赖,我该怎么做?

更具体地说,我正在考虑将我的域模型保持在六边形架构中,不受 Spring 代码的影响。我指定了一些我认为应该阻止模型使用 spring 的规则。但是,我可以使用 @Component@Bean 等 Spring 注释,而不会造成违规。

到目前为止我尝试过的是

layeredArchitecture().
layer("domain").definedBy(DOMAIN_LAYER).
layer("application").definedBy(APPLICATION_LAYER).
layer("primary-adapters").definedBy(PRIMARY_ADAPTERS).
layer("secondary-adapters").definedBy(SECONDARY_ADAPTERS).
layer("spring").definedBy("org.springframework..")
whereLayer("spring").mayOnlyBeAccessedByLayers("primary-adapters", "secondary-adapters", "application").
because("Domain should be kept spring-free").
check(CLASSES);

还有

noClasses().that().resideInAPackage(DOMAIN_LAYER).
should().dependOnClassesThat().resideInAPackage("org.springframework..").
check(CLASSES);

noClasses().that().resideInAPackage(DOMAIN_LAYER).
should().accessClassesThat().resideInAPackage("org.springframework..").
check(CLASSES);

Here尽管 com.example.app.domain.Factory 正在导入 org.springframework...,但执行测试效果很好的代码示例。

最佳答案

您可以使用DescribedPredicate:

void domainSpring() {
DescribedPredicate<JavaAnnotation> springAnnotationPredicate = new DescribedPredicate<JavaAnnotation>("Spring filter") {
@Override
public boolean apply(JavaAnnotation input) {
return input.getType().getPackageName().startsWith("org.springframework");
}
};
classes().that().resideInAPackage(DOMAIN_LAYER).should()
.notBeAnnotatedWith(springAnnotationPredicate).check(CLASSES);

}

关于java - 如何防止某些包在 ArchUnit 中使用 spring?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53787810/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com