Автоматически подключаемая служба имеет значение null в определенных методах

#java #spring #spring-boot

#java #весна #spring-boot

Вопрос:

У меня есть приложение spring boot, в котором внезапно службы autowired возвращают null при определенных методах.

Вот фрагмент кода для контроллера:

 @RestController
@RequestMapping("/user")
@CrossOrigin
public class UserManagementController {

  @Autowired
  private UserService userService;

  ...

  @PostMapping("/register")
  private GameInfo register(@RequestBody UserInfo userInfo) {
    User user = new User();
    ...
    user.setUsername("user-"   userService.count());
    ...
    return gameController.getGameInfo(user);
  }

  ...

  @PostMapping("/statistics")
  public StatisticsInfo statistics(
        @RequestParam(name = "username", required = true) String username,
        Authentication authentication) {
    User user = userService.findByUsername(username);
    ...
  }
}
 

Значение userService null в первом методе и отлично работает во втором.

ОБНОВЛЕНИЕ: вот фрагмент кода для UserService, который имеет значение null в методе «register».

 @Service
public class UserService implements UserDetailsService {

    @Autowired
    private UserRepository repository;

    public long count() {
        return repository.count();
    }    
    ...
}
 

У userService него есть обычные методы CRUD.
Пожалуйста, обратите внимание, что UserService имеет значение null, поэтому при вызове любого из его методов возникает исключение NullPointerException .

ОБНОВЛЕНИЕ 2:

Я создал клон неисправного метода register и назвал его dontRegister , это волшебным образом решило проблему register , но ввело ту же проблему в новый метод.

Я не понимаю логики, стоящей за этим, поскольку кажется, что мне всегда нужно добавлять один дополнительный неиспользуемый метод.

Я буду держать вопрос открытым, пока, возможно, кто-нибудь не придумает объяснение.

Комментарии:

1. Вы уверены, что второй метод не переопределен в подклассе? (т. Е. Вы уверены, что этот код действительно выполняется?)

2. К сожалению, да. Я много раз просматривал и тестировал его в postman, прежде чем разочаровался и задал вопрос здесь. Кроме того, для этого контроллера нет подклассов

3. Что вы имеете в виду под «возвращает null»? Из метода count()?

4. Вы не включили конструктор или любое другое место, где поле может быть установлено в вашем коде. Возможно ли, что этот второй метод вызывается до инициализации поля?

5. @daniu сам «UserService» имеет значение null, а не метод count().

Ответ №1:

Ваш метод регистрации private — make it public . Логически он должен быть общедоступным в любом случае, поскольку он вызывается извне пакета.

Комментарии:

1. Очень хороший улов, вероятно, это проблема. Я проверю еще раз и вернусь, чтобы отметить это как правильный ответ. Спасибо

2. метод «register» по-прежнему является закрытым, но теперь он работает после добавления метода «dontRegister». Для меня это пока не имеет смысла, но я приму этот ответ.