Immutable @ConfigurationProperties

后端 未结 7 1920
误落风尘
误落风尘 2020-12-08 13:55

Is it possible to have immutable (final) fields with Spring Boot\'s @ConfigurationProperties annotation? Example below

@ConfigurationProperties(         


        
7条回答
  •  猫巷女王i
    2020-12-08 14:11

    My idea is to encapsulate property groups via inner classes and expose interfaces with getters only.

    Properties file:

    myapp.security.token-duration=30m
    myapp.security.expired-tokens-check-interval=5m
    
    myapp.scheduler.pool-size=2
    

    Code:

    @Component
    @ConfigurationProperties("myapp")
    @Validated
    public class ApplicationProperties
    {
        private final Security security = new Security();
        private final Scheduler scheduler = new Scheduler();
    
        public interface SecurityProperties
        {
            Duration getTokenDuration();
            Duration getExpiredTokensCheckInterval();
        }
    
        public interface SchedulerProperties
        {
            int getPoolSize();
        }
    
        static private class Security implements SecurityProperties
        {
            @DurationUnit(ChronoUnit.MINUTES)
            private Duration tokenDuration = Duration.ofMinutes(30);
    
            @DurationUnit(ChronoUnit.MINUTES)
            private Duration expiredTokensCheckInterval = Duration.ofMinutes(10);
    
            @Override
            public Duration getTokenDuration()
            {
                return tokenDuration;
            }
    
            @Override
            public Duration getExpiredTokensCheckInterval()
            {
                return expiredTokensCheckInterval;
            }
    
            public void setTokenDuration(Duration duration)
            {
                this.tokenDuration = duration;
            }
    
            public void setExpiredTokensCheckInterval(Duration duration)
            {
                this.expiredTokensCheckInterval = duration;
            }
    
            @Override
            public String toString()
            {
                final StringBuffer sb = new StringBuffer("{ ");
                sb.append("tokenDuration=").append(tokenDuration);
                sb.append(", expiredTokensCheckInterval=").append(expiredTokensCheckInterval);
                sb.append(" }");
                return sb.toString();
            }
        }
    
        static private class Scheduler implements SchedulerProperties
        {
            @Min(1)
            @Max(5)
            private int poolSize = 1;
    
            @Override
            public int getPoolSize()
            {
                return poolSize;
            }
    
            public void setPoolSize(int poolSize)
            {
                this.poolSize = poolSize;
            }
    
            @Override
            public String toString()
            {
                final StringBuilder sb = new StringBuilder("{ ");
                sb.append("poolSize=").append(poolSize);
                sb.append(" }");
                return sb.toString();
            }
        }
    
        public SecurityProperties getSecurity()     { return security; }
        public SchedulerProperties getScheduler()   { return scheduler; }
    
        @Override
        public String toString()
        {
            final StringBuilder sb = new StringBuilder("{ ");
            sb.append("security=").append(security);
            sb.append(", scheduler=").append(scheduler);
            sb.append(" }");
            return sb.toString();
        }
    }
    

提交回复
热议问题