【问题标题】:Set default value of class property with @Bean configuration in Spring Boot在 Spring Boot 中使用 @Bean 配置设置类属性的默认值
【发布时间】:2020-10-17 14:32:59
【问题描述】:

我想使用 Lombok Builder 为以下类设置默认 LocalDateTime。它的值应该来自@Bean 配置。

    @Data
    public class Foo {
        @Builder.Default
        LocalDateTime created = LocalDateTime.now(clock);
    }

这里是时钟配置。该值应在对象初始化时设置:

@Configuration
public class TimeConfig {
    public final static String TIME_ZONE = "UTC";

    @Bean
    public Clock clock() {
        TimeZone.setDefault(TimeZone.getTimeZone(TIME_ZONE));
        return Clock.systemUTC();
    }
}

我想要实现的是使用当前时钟自动设置创建时间戳。时钟具有用于测试的静态值。 我怎样才能做到这一点?

【问题讨论】:

    标签: java spring spring-boot lombok


    【解决方案1】:

    如果您需要在 spring 上下文中及其外部(在 lombok 中)使用此时钟配置实例 然后我会这样做: 首先通过静态持有者模式创建一个配置时区的时钟单例

    public class ClockInstance {
        public final static String TIME_ZONE = "UTC";
        static {
            TimeZone.setDefault(TimeZone.getTimeZone(TIME_ZONE));
        }
    
        public Clock getClock(){
            return Clock.systemUTC();
        }
    
        private ClockInstance() {
        }
    
        private static class Holder {
            private static final ClockInstance INSTANCE = new ClockInstance();
        }
    
        public static ClockInstance getInstance() {
            return Holder.INSTANCE;
        }
    }
    

    然后在你的 spring 配置中使用这个时钟实例

    @Configuration
    public class TimeConfig {
    
        @Bean
        public Clock clock() {
            return ClockInstance.getInstance().getClock();
        }
    }
    

    您将能够在您的 Foo 类中使用正确的时钟配置

    @Data
    public class Foo {
        @Builder.Default
        LocalDateTime created = LocalDateTime.now(ClockInstance.getInstance().getClock());
    }
    

    这种方法有一些缺点,例如您不能轻易地将这个时钟实例替换为某个固定时钟,因此您需要在测试中更改 created 字段,例如通过 Foo 类的构造函数

    【讨论】:

    • 感谢您的回答:)
    猜你喜欢
    • 1970-01-01
    • 2015-05-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-09-16
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多