使用Lombok和构造函数注入时,Spring注入的bean为null

zyfwsgd6  于 2024-01-05  发布在  Spring
关注(0)|答案(1)|浏览(181)

我正在将一个用 Spring 实现的 maven 项目迁移到 Sping Boot 1.5.20.RELEASE
我有一个适配器类,它将被所有用@RestControllers注解的类扩展,以保证与前端的向后兼容性。

  1. public class RestControllerAdapter {
  2. private MessageTemplate messageTemplate;
  3. private MessageTemplate getMessageTemplate() {
  4. if (messageTemplate == null) {
  5. messageTemplate = ApplicationContextUtils.getBean(MessageTemplate.class);
  6. }
  7. return messageTemplate;
  8. }
  9. protected final String message(@NonNull String code) {
  10. return getMessageTemplate().getMessage(code);
  11. }
  12. protected final String message(@NonNull String code, Object... args) {
  13. return getMessageTemplate().getMessage(code, args);
  14. }
  15. protected final ModelMap success() {
  16. val map = new ModelMap();
  17. map.put("success", true);
  18. map.put("message", getMessageTemplate().getMessage("message.success.default"));
  19. return map;
  20. }
  21. protected final ModelMap error(@NonNull String message) {
  22. val map = new ModelMap(2);
  23. map.put("success", false);
  24. map.put("error", message);
  25. return map;
  26. }
  27. protected final ModelMap retry(@NonNull Exception ex) {
  28. val map = new ModelMap(3);
  29. map.put("success", false);
  30. map.put("error", ex.getMessage());
  31. map.put("confirmar", true);
  32. return map;
  33. }
  34. protected final ModelMap empty() {
  35. return new ModelMap();
  36. }
  37. @ExceptionHandler(JpaSystemException.class)
  38. public ModelMap handleJpaSystemException(JpaSystemException ex) {
  39. log.error(ex.getMessage(), ex);
  40. return createError(ex.getMostSpecificCause());
  41. }
  42. @ExceptionHandler(DataIntegrityViolationException.class)
  43. public ModelMap handleDataIntegrityViolationException(DataIntegrityViolationException ex) {
  44. log.error(ex.getMessage(), ex);
  45. return createError(ex.getMostSpecificCause());
  46. }
  47. private ModelMap createError(Throwable ex) {
  48. val modelMap = new ModelMap();
  49. modelMap.put("error", translateErrorMessage(ex));
  50. modelMap.put("success", false);
  51. return modelMap;
  52. }
  53. protected String translateErrorMessage(@NonNull Throwable ex) {
  54. String message = ex.getLocalizedMessage().isEmpty() ? ex.getMessage() : ex.getLocalizedMessage();
  55. if (message.contains("12519")) {
  56. message = getMessageTemplate().getMessage("db.connection.error");
  57. } else if (message.contains("SYS_C0015328")) {
  58. message = getMessageTemplate().getMessage("plan.tasks.successors.sequence.error");
  59. } else if (message.contains("SYS_C0012415")) {
  60. message = getMessageTemplate().getMessage("positions.sequence.error");
  61. } else if (message.contains("SYS_C006343")) {
  62. message = getMessageTemplate().getMessage("documents.sequence.error");
  63. } else if (message.contains("UNIQUE_EMAIL")) {
  64. message = getMessageTemplate().getMessage("user.email.unique");
  65. } else if (message.contains("FK_PLTASK_TASK")) {
  66. message = getMessageTemplate().getMessage("task.delete.error");
  67. }
  68. return message;
  69. }
  70. }

字符串
我有一个用于用户管理的rest控制器类

  1. @RestController
  2. @RequestMapping(value = "/usuario")
  3. @RequiredArgsConstructor
  4. public class UserRestController extends RestControllerAdapter {
  5. private final UserService usersService;
  6. private final UsersRepository usersRepository;
  7. private final UserBackupRepository userBackupRepository;
  8. private final AreaRepository areaRepository;
  9. private final PositionRepository positionRepository;
  10. private final UserMapper userMapper;
  11. @PreAuthorize(value = SecurityUtils.ADMIN_EDIT_AUTHORITY)
  12. @PutMapping("/{userId}")
  13. public ModelMap update(@Valid @RequestBody UserCommand userCommand,
  14. @PathVariable int userId) {
  15. try {
  16. usersService.update(userId, userCommand);
  17. return success();
  18. } catch (DuplicateHolderException ex) {
  19. return retry(ex);
  20. }
  21. }
  22. @PreAuthorize(value = SecurityUtils.ADMIN_EDIT_AUTHORITY)
  23. @PostMapping("/activarUsuario")
  24. public ModelMap enable(@RequestParam("usuario_id") Integer id,
  25. @AuthenticationPrincipal Users user) {
  26. if (user.getRol().getId() == 1 || user.getRol().getId() == 3) {
  27. usersService.enable(id);
  28. return success();
  29. }
  30. return empty();
  31. }
  32. @Override
  33. protected String translateErrorMessage(@NonNull Throwable ex) {
  34. String message = ex.getMessage();
  35. if (message.contains("correo_unico")) {
  36. message = "Ya este correo está asigado a un usuario.";
  37. } else if (message.contains("SYS_C0012422") ||
  38. message.contains("SYS_C0015349")) {
  39. message = "La secuencia de usuarios no está correctamente
  40. configurada.";
  41. } else if (message.contains("UNIQUE_BACKUP")) {
  42. message = "Un usuario no puede ser backup mas de una ocasión.";
  43. } else if (message.contains("UNIQUE_EMAIL")) {
  44. message = "No se puede insertar el usuario porque este correo ya
  45. está en uso.";
  46. } else if (message.contains("FK_PLAN_USER_ACTIVADO")) {
  47. message = "No se puede insertar el usuario porque existe un plan que
  48. ha sido activado por dicho usuario.";
  49. } else if (message.contains("FK_TASK_EXECUTED_BY")) {
  50. message = "No se puede insertar el usuario porque existen tareas
  51. ejecutadas por dicho usuario.";
  52. }
  53. return super.translateErrorMessage(ex);
  54. }
  55. }


当调用UserRestController::update时,由于注入到UserServiceImpl中的所有依赖项都为null,因此抛出NullPointerException,如下图所示。


的数据
然而,当UserRestController::enable被调用时,一切都正常。两者都依赖于UserServiceImpl的方法调用。

  1. @Service
  2. @RequiredArgsConstructor
  3. @Transactional(rollbackFor = Exception.class)
  4. class UserServiceImpl implements UserService {
  5. private static final int POSITION_USERS_LIMIT = 3;
  6. private static final int BACKUPS_LIMIT = 2;
  7. private static final String POSITION_LIMIT_ERROR = "user.position.limit";
  8. private static final String BACKUP_LIMIT_ERROR = "user.backup.limit";
  9. private final UsersRepository usersRepository;
  10. private final UserBackupRepository userBackupRepository;
  11. private final RolRepository rolRepository;
  12. private final PositionRepository positionRepository;
  13. private final PlanRepository planRepository;
  14. private final PlTaskRepository plTaskRepository;
  15. private final UserNotificationRepository userNotificationRepository;
  16. private final NotificacionBackupRepository notificacionBackupRepository;
  17. private final UserTokenRepository userTokenRepository;
  18. private final UserMapper userMapper;
  19. private final PasswordTemplate passwordTemplate;
  20. private final MessageTemplate messageTemplate;
  21. @Override
  22. public final Users update(int id, @NonNull UserCommand userCommand) {
  23. val user = usersRepository.findById(id)
  24. .orElseThrow(() -> new IllegalArgumentException("Usuario a editar requerido"));
  25. val role = loadRoleFrom(userCommand);
  26. val newPosition = loadPositionFrom(userCommand);
  27. if (userCommand.isCheckConstraints()) {
  28. assertUserUpdate(userCommand, user, newPosition);
  29. }
  30. if (userCommand.isHolder()) {
  31. if (!user.isTitular() && usersRepository.existsByPositionAndTitularTrue(user.getPosition())) {
  32. userBackupRepository.deleteAllByUsuarioPositionAndUsuarioTitularTrue(user.getPosition());
  33. usersRepository.updateTitularFalse(user.getPosition());
  34. } else if (!user.hasPosition(newPosition) && usersRepository.existsByPositionAndTitularTrue(newPosition)) {
  35. userBackupRepository.deleteAllByUsuarioPositionAndUsuarioTitularTrue(newPosition);
  36. usersRepository.updateTitularFalse(newPosition);
  37. } else if (user.isTitular()) {
  38. userBackupRepository.deleteAllByUsuarioPositionAndUsuarioTitularTrue(user.getPosition());
  39. }
  40. } else {
  41. userBackupRepository.deleteAllByUsuarioPositionAndUsuarioTitularTrue(user.getPosition());
  42. }
  43. user.setEmail(userCommand.getEmail());
  44. user.setUsuario(userCommand.getEmail());
  45. user.setName(userCommand.getName());
  46. user.setLastname(userCommand.getLastname());
  47. user.setActive(userCommand.isEnabled());
  48. user.setTitular(userCommand.isHolder());
  49. user.setPosition(newPosition);
  50. user.setRol(role);
  51. if (!StringUtils.isEmpty(userCommand.getPassword())) {
  52. user.setKeypass(passwordTemplate.encode(user.getPassword()));
  53. }
  54. usersRepository.save(user);
  55. addBackups(userCommand, user);
  56. return user;
  57. }
  58. @Override
  59. public Users enable(@NonNull Integer id) {
  60. val user = usersRepository.findById(id).orElseThrow(NoSuchElementException::new);
  61. user.setActive(!user.isActive());
  62. usersRepository.save(user);
  63. return user;
  64. }
  65. }


这个虫子快把我杀了,这是一种奇怪的行为.

knpiaxh1

knpiaxh11#

最后我解决了这个问题。
它与UserServiceImpl::update方法中的final关键字有关
它不允许注入过程正常工作,而且它完全有意义,因为用@Transactional注解的类不能是final
我已经删除了它,现在一切正常。示例代码是here

相关问题