В моем веб-приложении на основе spring-maven-jpa некоторые данные должны быть зашифрованы непосредственно перед сохранением в БД, а затем расшифрованы обратно при объединении из БД.
Итак, я создал свой сервис шифрования, и теперь мне интересно, какой должна быть лучшая реализация.
С точки зрения OO, я думаю, что каждая сущность должна знать, как защищать и не защищать себя. Это приводит меня к внедрению моего шифровальщика в абстрактный базовый объект:
public abstract class BaseEntity {
@Autowired(required = true)
protected SecurityProvider securityService;
public BaseEntity() {
}
/**
* secure the entity (if required) using the securityService
*/
@PrePersist
@PreUpdate
protected abstract void secure();
/**
* un-secure the entity (if required) using the securityService
*/
@PostLoad
protected abstract void unsecure();
/*--- Getters & Setters ---*/
public SecurityProvider getSecurityService() {
return securityService;
}
public void setSecurityService(SecurityProvider securityService) {
this.securityService = securityService;
}
}
Как видите, для этого я пытаюсь использовать обратные вызовы @PrePersist, @PreUpdate и @PostLoad.
На данный момент у меня есть некоторые проблемы с инъекцией шифровальщика, поэтому я не могу проверить его полностью.
Вопрос в том, выглядит ли это хорошей практикой? Можете ли вы предложить улучшения или лучший способ?
ОБНОВИТЬ:
После выполнения некоторых тестов кажется, что аннотации @PrePersist и @PreUpdate работают нормально, и каждый объект шифруется непосредственно перед записью в БД. Но @PostLoad, похоже, работает не так, как я ожидал. Я думал, что он будет запускаться каждый раз, когда я закончу объединение объекта из БД, но по какой-то причине метод не вызывается. Я неправильно понял идею @PostLoad?