【问题标题】:How to validate annotations during build or during startup on Spring Boot?如何在构建期间或 Spring Boot 启动期间验证注释?
【发布时间】:2021-02-13 14:55:22
【问题描述】:

例如,假设我有一个 @TimedMillis 和一个 @TimedSeconds 注释。他们所做的是记录方法执行的持续时间,一个以毫秒为单位,另一个以秒为单位。

让它们都使用相同的方法没有任何意义。一个方法可以有这些注解之一,也可以一个都没有,但不能同时有。

如何检查一个方法在构建过程中是否同时拥有它们(最好)?如果在构建期间不可能,我该如何在启动期间执行此操作并阻止应用程序启动?我已经看到hibernate在启动期间这样做了。虽然它没有阻止应用程序启动,但它确实阻止了应用程序工作。

【问题讨论】:

    标签: java spring spring-boot annotations


    【解决方案1】:

    您可以使用reflections 库轻松扫描包及其所有子包,以查找包含使用特定注释注释的方法的类。

    然后,您可以在任何您认为合适的地方注入验证逻辑。

    例如你可以:

    1. 添加反射依赖:
    <dependency>
        <groupId>org.reflections</groupId>
        <artifactId>reflections</artifactId>
        <version>0.9.12</version>
    </dependency>
    
    1. 添加验证逻辑,如果需要,甚至比 Spring Boot 引导更早,如下所示:
      public static void main(String[] args) {
        validateAnnotations();
        SpringApplication.run(ExampleApplication.class, args);
      }
    
      private static void validateAnnotations() {
        Set<Method> annotatedMethods = 
          new Reflections("com.example", new MethodAnnotationsScanner())
          .getMethodsAnnotatedWith(TimedMillis.class);
        
        annotatedMethods.stream()
        .filter(method -> method.getDeclaredAnnotationsByType(TimedSeconds.class).length > 0)
        .findFirst()
        .ifPresent(method -> {
          throw new IllegalStateException("Invalid annotations for method " + method);
        });
      }
    
    

    【讨论】:

    【解决方案2】:

    还有其他选择 - 通过注释本身使其成为不可能。
    这种方法假定 @TimedMillis 和 @TimedSeconds 实际上非常相似 - 并且可以重构为单个注释。
    为了实现这样的功能,可以引入新的注释 - 它将具有所需的时间单位作为提供的值。

    @Target({ElementType.METHOD})
    public @interface Timed {
    
        /**
         * Defines time unit of duration.
         *
         * @return duration time unit
         */
        TimeUnit timeUnit();
    }
    

    这将有助于实现所需的功能,因为不允许重复注释(仅当未使用 @Repeatable 标记时)

    【讨论】:

      【解决方案3】:

      您可以定义自定义annotation processor 来执行此验证。注释处理将在构建时进行。这是一个很好的关于如何使用注解处理 API 的教程:https://www.baeldung.com/java-annotation-processing-builder

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2017-11-07
        • 1970-01-01
        • 2018-11-13
        • 2019-04-11
        • 1970-01-01
        • 1970-01-01
        • 2017-09-09
        • 2019-08-15
        相关资源
        最近更新 更多