2016-08-04 199 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}」)從屬性文件更改值不是一個好習慣。如果您從屬性文件更改任何值,則需要重新啓動服務器或重新運行應用程序。所以最好在數據庫中存儲小時數。您可以隨時輕鬆更新。