J'essaie d'utiliser l'annotation @Transactional
dans une méthode sur mon service pour charger un champ paresseusement. Cependant, en utilisant @Transactional
sur ma classe d'implémentation, tous les champs autowired sont null
.Spring boot 2 L'annotation @Transactional rend les champs Autowired null
Voici mon implémentation:
@Service
public class UserServiceImpl implements UserService {
/**
* DefaultMapper.
*/
@Autowired
private DefaultMapper defaultMapper;
/**
* Resource service injection.
*/
@Autowired
private ResourceService resourceService;
/**
* UserRepository.
*/
@Autowired
private UserRepository userRepository;
/**
* Jwt Factory.
*/
@Autowired
private JwtService jwtService;
@Override
@Transactional
public final UserDto findByLogin(final String login) throws ResourceNotFoundException {
// user repository is null here when using @Transactional
User user = this.userRepository.findByLogin(login)
.orElseThrow(() -> new ResourceNotFoundException(
resourceService.getMessage(MessageBundle.EXCEPTION, "resource.notfound.user.login")
));
UserDto userDto = defaultMapper.asUserDtoWithRoles(user);
return userDto;
}
Merci à l'avance.
Supprimez 'final' de votre méthode ou définissez' spring.aop.proxy-target-class = false' dans votre 'application.properties'. ** NOTE: ** Cela nécessite Spring Boot 1.5.3 ou plus pour fonctionner pleinement! –
Le contexte transactionnel est-il activé dans votre application de printemps? – drgPP
Faire une transaction est la plupart du temps inutile pendant une action de lecture, êtes-vous sûr que vous avez besoin d'une transaction de lecture? – Zorglube