#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». Для меня это пока не имеет смысла, но я приму этот ответ.