2016-08-04 20 views
5

Potrzebuję właściwości zmiany w mojej aplikacji w czasie wykonywania. Na przykład mam usługę, która wysyła wiadomość e-mail z hasłem resetowania. Wniosek jest ważny 12 godzin. Ale chcę zmienić ten czas na 24 lub więcej w czasie wykonywania. Muszę dać możliwość tej akcji dla administratora.Jak zmieniać wartości właściwości w czasie wykonywania na wiosnę

Mój plik obiekcie

hours.expired=12 

Moje usługi

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

moja konfiguracja xml wiosna

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

Czy mogę zmienić tę wartość w jakiś sposób w czasie wykonywania?

Odpowiedz

10

Wystarczy odejść od konfiguracji xml jej prawie 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; 
    } 

} 

Z @Value jesteś pociągnięcie hours.expired wartość z właściwości pliku, jeśli nie ma domyślną wartość będzie 12. Można również zadzwonić setHoursExpired w środowisku wykonawczym i ustaw nową wartość oraz udostępnij tę funkcję administratorom.

Jest to wygodne dla jednorazowych czynności. Jeśli chcesz, aby twoi administratorzy trwale zmieniali czas wygaśnięcia haseł, utrzymywałbym w nich godziny. Wyjątkowa wartość w mysql lub jakimś używanym db.

EDYCJA: odpowiadanie na doskonale poprawną uwagę @matt. Jeśli tak jest, przeniesienie się do Java confing nie jest możliwe. W przypadku niestandardowego zachowania można po prostu wyposażyć fasole zdefiniowane przez XML w swojej usłudze i wykonać dowolną logikę.

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

Dobra odpowiedź, doskonale pasuje do konfiguracji nie XML. Wystarczy wziąć pod uwagę, że niektóre projekty są w pełni oparte na XML, prawdopodobnie także jego. – Matt

+1

to nie odpowiada na pytanie –

+0

Wiem, że to holywar - xml lub java config lub groovy, ale dlaczego xml jest zły, jeśli działa dobrze? – vladdihoney

0

Muszę użyć konfiguracji XML. Nasz projekt opiera się na tym. Wreszcie muszę uzyskać wszystkie wartości konfiguracyjne z db. Najprostszym rozwiązaniem jest użycie usługi do konfiguracji i zawsze wywołaj stan konfiguracji z db.

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

ta wartość zwracana, co jest przechowywane w db.

Ale myślę, że jest lepsze rozwiązanie.

+0

Zazwyczaj tworzę dedykowaną usługę do pobierania konfiguracji z bazy danych. '@ Component public class MyProperties { private int hoursExpiredPassword; @PostConstruct public void init() throws Wyjątek { Lista configurations = configurationService.findAllConfigurations(); // ustaw wszystkie konfiguracje } } –

1

Nie jest dobrą praktyką zmiana wartości z plików właściwości za pomocą @Value ("$ {hours.expired}"). Jeśli zmienisz jakąkolwiek wartość z pliku właściwości, musisz zrestartować serwer lub ponownie uruchomić aplikację. więc lepiej jest przechowywać godziny. oczekiwana wartość w bazie danych. Możesz łatwo aktualizować w dowolnym momencie.

Powiązane problemy