当前位置: 首页 > 知识库问答 >
问题:

用ArchUnit限制对静态方法的访问

华锦
2023-03-14

在我们的体系结构指南中,我们应该只从域模型或存储库实现(在基础结构层)中实例化业务异常

 noClasses().that().resideOutsideOfPackages(DOMAIN).or(areImplementing(Repository.class))
                .should().callMethodWhere(
                target(owner(isAnnotatedWith(BusinessException.class)))
                        .and(target(modifier(JavaModifier.STATIC))));
methods().that().areStatic()
              .and().areDeclaredInClassesThat().areAnnotatedWith(BusinessException.class)
              .should().onlyBeCalled().byClassesThat(areImplementing(Repository.class))

同样,这不会编译,onlybeCalled不存在。

有人有主意吗?

共有1个答案

糜俊彦
2023-03-14

我不完全确定是否有更短的形式来表达您想要的内容,但我相信下面使用自定义谓词的代码片段可以完成这项工作。

noClasses().that()
            // Restriction applies to all classes outside DOMAIN package that are not Repository classes
            .resideOutsideOfPackages(DOMAIN)
            .and()
            .areNotAssignableFrom(Repository.class)
            .should()
            .callMethodWhere(describe("static methods in BusinessExceptions",
                              // Target method may not reside in class annotated with BusinessException
                methodCall -> methodCall.getTarget().getOwner().isAnnotatedWith(BusinessException.class) 
                       // And target method may not have the static modifier
                    && methodCall.getTarget()
                        .resolve()
                        .stream()
                        .anyMatch(m -> m.getModifiers().contains(JavaModifier.STATIC))));

我唯一不确定的一点是methodcall.gettarget().resolve()返回一组JavaMethod类。

 类似资料:
  • 问题内容: 假设您的服务器目录中有很多html,css,js,img等文件。通常,互联网域中的任何用户都可以通过简单地输入完整的URL来访问这些文件,例如:http : //example.com/static- files/sub/index.html 现在,如果只希望授权用户能够加载那些文件怎么办?对于此示例,假设您的用户首先从这样的URL登录: http //example.com/logi

  • 问题内容: 我想限制登录用户可以使用的文件,否则返回403错误或类似错误。例如,用户只有在登录后才能查看/下载。 我知道如果未登录,如何使用Flask-Login控制文件的实际显示,但是如果他们直接在浏览器中访问链接,我将不知道如何阻止访问文件。 问题答案: Flask添加了一条静态路由来提供静态文件。在生产中,通常会“短路”此路由,以便Nginx在请求到达您的应用程序之前为文件提供服务。不用添加

  • 我有一个关于静态方法访问的问题。我有一个类,其中有4个静态方法。如代码所示: } 我正在从下面的代码调用来自onLoadShipperDetailsListCtrl()的setSortingEnable()方法: } 因此,如果我从其他类调用setSortingEnabled()方法,我会认为它是公共的,而其他方法是私有的,但它会给我一个错误:Java . lang . nosuchmethode

  • 本文向大家介绍SpringMVC访问静态资源的方法,包括了SpringMVC访问静态资源的方法的使用技巧和注意事项,需要的朋友参考一下 在SpringMVC中常用的就是Controller与View。但是我们常常会需要访问静态资源,如html,js,css,image等。 默认的访问的URL都会被DispatcherServlet所拦截,但是我们希望静态资源可以直接访问。该肿么办呢? 在配置文件:

  • 问题内容: 我是JAVA的新手,我喜欢尝试并理解所有内容。 在JAVA中访问静态方法“ hero.returnHp()”时,我具有以下内容: 该程序运行良好,但是我注意到Eclipse发出警告,指出“应以静态方式访问hero类型的静态方法。” 当我接受自动修复时,它会更改为“ Mike.returnHp();”。到“ hero.returnHp();”。 所以我有两个问题: 1)这有什么好处? 2

  • 问题内容: 在Java中,创建了静态方法来访问它而没有任何对象实例。这对我来说很有意义。但是最近我碰到一个奇怪的事情,Java中的静态方法也可以通过其对象实例进行访问。这对我来说似乎很奇怪。你们谁知道 Java 为什么提供此功能?允许在没有实例的情况下访问静态方法有什么意义? 问题答案: 这样做的好处是,它允许您采用实例方法并将其转换为静态方法,而无需修改任何现有代码(除 类之外),从而实现向后兼