Обновление сущности в классе с аннотацией @Transactional - PullRequest
0 голосов
/ 03 мая 2018

У меня есть собственная реализация UserDetails

public class CustomUserDetails extends org.springframework.security.core.userdetails.User {
     private UserEntity userEntity;
...
}

моя логинная реализация

@Service("userDetailsService")
public class UserDetailsServiceImpl implements UserDetailsService {
...

@Override
public UserDetails loadUserByUsername(final String username) throws UsernameNotFoundException {
    Optional<UserEntity> userOptional;
    if(username.contains("@")) {
        userOptional = userRepository.findByEmailIgnoreCaseAndEnabledTrue(username);
    } else {
        userOptional = userRepository.findByUsernameIgnoreCaseAndEnabledTrue(username);
    }

    ...

    return new CustomUserDetails(userOptional.get().getUsername(),
                                 userOptional.get().getPassword(),
                                 grantedAuthorities,
                                 userOptional.get());
}

Я получаю юридическое лицо, пользуясь услугой

@Service("authorizationService")
public class AuthorizationServiceImpl implements AuthorizationService {

    @Override
    public UserEntity getUser() {
        return ((CustomUserDetails) SecurityContextHolder.getContext().getAuthentication().getPrincipal()).getUserEntity();
    }
}

и назначьте новый пароль сайту, помеченному аннотацией @Transactional, но он не обновляется в базе данных

@Service("userPersistenceService")
@Transactional
public class UserPersistenceServiceImpl implements UserPersistenceService {
    /**
 * {@inheritDoc}
 */
@Override
public void updatePassword(
        @NotNull @Valid final ChangePasswordDTO changePasswordDTO
) throws ResourceNotFoundException, ResourceBadRequestException {
    log.info("Called with changePasswordDTO {}", changePasswordDTO);

    final UserEntity user = this.authorizationService.getUser();

    if(!EncryptUtils.matches(changePasswordDTO.getOldPassword(), user.getPassword())) {
        throw new ResourceBadRequestException("The entered password doesn't match the old password");
    }

    user.setPassword(EncryptUtils.encrypt(changePasswordDTO.getNewPassword()));
}
}

Мне бы хотелось, чтобы во время user.setPassword(...) немедленно автоматически обновлялись данные для сущностей в базе данных. Вот почему я добавил аннотацию @Transactional. Но это не работает. Почему?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...