고객님의 경우에 맞춤 Validator이 적합하다고 생각합니다.
먼저 - 그것의 이전 상태를 저장하기 위해 당신의 실체를 업데이트 (@AlanHay 덕분에) :
@Entity
class ItemEntity {
@Transient
private ItemEntity previousState;
@PostLoad
private void setPreviousState(){
previousState = new ItemEntity();
//copy the fields
}
public ItemEntity getPreviousState(){
return previousState;
}
}
그런 다음 어떤 '권위'와 현재 사용자가 필드를 변경 한 경우 확인하는 검증을 구현 :
public class ItemValidator implements Validator {
@Override
public boolean supports(Class<?> clazz) {
//...
}
@Override
public void validate(Object target, Errors errors) {
Collection<? extends GrantedAuthority> authorities = SecurityContextHolder.getContext().getAuthentication().getAuthorities();
SimpleGrantedAuthority userRole = new SimpleGrantedAuthority("ROLE_USER");
if (authorities.contains(userRole)) {
ItemEntity item = (ItemEntity) target;
prevItem = item.getPreviousState();
String prevName = prevItem.getName();
String prevCreator = prevItem.getCreator();
String newName = item.getName();
String newCreator = item.getCreator();
if (!prevName.equals(newName)) {
errors.rejectValue("name", "You cannot change Name field!");
}
if (!prevCreator.equals(newCreator)) {
errors.rejectValue("creator", "You cannot change Creator field!");
}
}
// Other checks...
}
}
그런 RepositoryRestConfigurerAdapter
플러그인이 검사기 :
@Configuration
public class RepoRestConfig extends RepositoryRestConfigurerAdapter {
@Override
public void configureValidatingRepositoryEventListener(ValidatingRepositoryEventListener v) {
v.addValidator("beforeCreate", itemValidator()); // POST (if needed)
v.addValidator("beforeSave", itemValidator()); // PUT/PATCH
super.configureValidatingRepositoryEventListener(v);
}
@Bean
ListingValidator itemValidator() {
return new ItemValidator();
}
}
나는 이것이 작동해야한다고 생각합니다 ...
REST 저장소 이벤트를 시도 했습니까? @HandleBeforeSave 이벤트와 마찬가지로? –
예, 문제는 핸들러에 전달 된 항목이 PUT 요청을 통해 전달 된 항목으로 변경된 것입니다. – Florian
그리고 데이터베이스 계층의 변경을 처리 할 수 있습니까 (예 : mysql setting updateable = false를 사용하는 경우)? –