2016-08-04 116 views
5

我需要在运行时在应用程序中更改属性。 例如,我有一项服务可以发送带有resset密码的电子邮件。请求有效期为12小时。但我想在运行时将此时间更改为24或更多。我需要为管理员提供此操作的机会。在运行时如何在运行时更改属性值

我的属性文件中有

hours.expired=12 

我的服务

private int hoursExpiredPassword; 

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; 
} 

我的Spring XML配置

<bean id="passwordResetRequestService" class="pl.lublin.example.services.servicesDAO.PasswordResetRequestService"> 
    <property name="passwordResetRequestDao" ref="passwordResetRequestDao"></property> 
    <property name="hoursExpiredPassword" value="${hours.expired}"></property> 
</bean> 

我能在运行时以某种方式修改这个值?

回答

10

刚刚从XML配置搬走了几乎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; 
    } 

} 

随着@Value你拉从属性文件,如果没有默认值将是12.您能也呼吁setHoursExpired hours.expired值并在运行时设置新的价值并向管理员展示该功能。

这对一次性动作很方便。如果你想让你的管理员永久更改密码过期时间,我会坚持hour.expired价值在MySQL或你使用的是什么数据库。

编辑:回答完全有效的@matt备注。如果是这样的话,转向Java confing不是一种选择。对于自定义行为,您可以在服务中自动装载XML定义的bean,并执行任何您想要的逻辑。

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

很好的答案,完全适用于非XML配置。只要考虑一些项目是完全建立在XML上的,可能也是他的。 – Matt

+1

这不回答问题 –

+0

我知道它是holywar-xml或java配置或常规,但为什么xml是坏的,如果它运作良好? – vladdihoney

0

我必须使用XML配置。我们的项目是基于它的。 最后,我需要从db中获取所有配置值。最简单的解决方案是使用service进行配置,并始终从db调用配置状态。

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

这个返回值什么是存储在分贝。

但我觉得有更好的解决方案。

+0

我通常创建专用服务以从数据库中检索配置。 '@Component public class MyProperties {intl_local_time hoursExpiredPassword; @PostConstruct public void init()throws Exception { List configurations = configurationService.findAllConfigurations(); //设置所有配置 } ' –

1

使用@Value(“$ {hours.expired}”)从属性文件更改值不是一个好习惯。如果您从属性文件更改任何值,则需要重新启动服务器或重新运行应用程序。所以最好在数据库中存储小时数。您可以随时轻松更新。