web-dev-qa-db-fra.com

Comment modifier les valeurs des propriétés lors de l'exécution au printemps

J'ai besoin de changer les propriétés de mon application au moment de l'exécution. Par exemple, j'ai un service qui envoie un e-mail avec un mot de passe resset. La demande est valide 12 heures. Mais je veux changer cette fois à 24 ou plus au moment de l'exécution. Je dois donner l'occasion à cette action pour l'administrateur.

Mon dossier de propriété a 

hours.expired=12

Mon service 

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

ma configuration printanière 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>

Puis-je modifier cette valeur d'une certaine manière lors de l'exécution?

6
Tomasz Dębski

Éloignez-vous simplement de la configuration XML, c'est presque 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;
   }

}

Avec @Value, vous extrayez la valeur hours.expired du fichier de propriétés. S'il n'y a pas de valeur, la valeur par défaut sera 12. Vous pouvez également appeler setHoursExpired à l'exécution, définir une nouvelle valeur et exposer cette fonctionnalité à vos administrateurs.

C'est pratique pour les actions ponctuelles. Si vous voulez que vos administrateurs changent en permanence le délai d’expiration du mot de passe, j’aimerais plutôt conserver la valeur hours.expired dans mysql ou la base de données que vous utilisez.

EDIT: répondre à la remarque parfaitement valide @matt. Si tel est le cas, le passage à Java confing n'est pas une option. Pour un comportement personnalisé, vous pouvez simplement autoriser les beans définis par XML dans votre service et exécuter la logique de votre choix.

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

Il n'est pas recommandé de modifier la valeur des fichiers de propriétés à l'aide de @Value ("$ {hours.expired}"). Si vous modifiez une valeur du fichier de propriétés, vous devez redémarrer votre serveur ou réexécuter l'application. il est donc préférable de stocker la valeur hours.expired dans la base de données. Vous pouvez facilement mettre à jour quand vous le souhaitez.

0
Suman Behara

Je dois utiliser la configuration XML. Notre projet est basé sur cela ..___ Enfin, je dois obtenir toutes les valeurs de configuration de la base de données. La solution la plus simple est le service utilisé pour la configuration et invoque toujours l'état de configuration de la base de données. 

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

cette valeur de retour ce qui est stocké dans db. 

Mais je pense qu'il y a une meilleure solution.

0
Tomasz Dębski