How change property values at runtime in Spring

后端 未结 3 1087
生来不讨喜
生来不讨喜 2020-12-17 20:05

I need change properties in my application at runtime. For example I have a service which send a e-mail with resset password. Request is valid 12 hours. But I want to chang

相关标签:
3条回答
  • 2020-12-17 20:49

    Just move away from xml configuration its almost 2017.

    @Service
    public class PasswordResetRequestService {
    
    @Value("${hours.expired:12}") 
    private int hoursExpiredPassword;
    
    @Autowired
    private PasswordResetRequestDao passwordResetRequestDao;
    
    public void setHoursExpiredPassword(int hoursExpiredPassword) {
        this.hoursExpiredPassword = hoursExpiredPassword;
    }
    
    
    @Override
    public ERequests checkRequest(String number, Date date) {
        PasswordResetRequest findedObject = passwordResetRequestDao.getObjectByElement(PasswordResetRequest.class, "requestId", number);
        if (findedObject == null){
            return ERequests.BAD_REQUEST;
        }else{
            long result = getDateDiff(findedObject.getRequestDate(),date,TimeUnit.HOURS);
            if(result >= hoursExpiredPassword){
                return ERequests.EXPIRED_REQUEST;
            }
        }
        return ERequests.CORRECT_REQUEST;
       }
    
    }
    

    With @Value you are pulling hours.expired value from properties file, if there is no value default will be 12. You can also call setHoursExpired at runtime and set new value and expose that functionality to your admins.

    This is convenient for one time actions. If you want your admins to permanently change password expiration time i would instead persist hours.expired value in mysql or whatver db you are using.

    EDIT : answering to perfectly valid @matt remark . If that is the case and moving to Java confing is not an option. For custom behavior you can just autowire your XML-defined beans in your service and perform whatever logic you want to.

    @Autowired
    private pl.lublin.zeto.zetoRA.services.servicesDAO.PasswordResetRequestService passwordResetRequestService;
    

    EDIT: 2020

    Defacto standard way of doing this in 2020 is setup of Cloud Config server backed by a git repository. Example:

    spring:
      cloud:
        config:
          server:
            git:
              uri: https://github.com/spring-cloud-samples/config-repo
    

    as explained here : https://cloud.spring.io/spring-cloud-config/reference/html/

    You need standalone spring config app which will be used by all the client apps. The most robust solution is to back spring config server by git repository. By doing this we have version control on production settings and avoid the risk of changing something then forgetting what the previous value was etc.

    0 讨论(0)
  • 2020-12-17 20:51

    I have to use XML configuration. Our project is based on it. Finally I need to get all configuration values from db. The simplest solution is used service for configuration and always invoke configuration state from db.

    configurationService.findAllConfigurations().get("hours.expired")
    

    this return value what is stored in db.

    But I think there is better solution.

    0 讨论(0)
  • 2020-12-17 20:56

    It's not a good practice to change value from property files using @Value("${hours.expired}"). If your change any value from property file,you need to restart your server or re-run application. so its better to store hours.expired value in Database. You can easily update whenever you want.

    0 讨论(0)
提交回复
热议问题