【问题标题】:Autowired Service is null in specific methodsAutowired Service 在特定方法中为空
【发布时间】:2021-01-18 20:39:42
【问题描述】:

我有一个 Spring Boot 应用程序,其中自动装配的服务突然在特定方法返回 null。

这是控制器的代码 sn-p:

@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 在第一种方法中为空,在第二种方法中工作正常。

更新: 这是 UserService 的代码 sn-p,在“注册”方法中为 null。

@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的问题,但在新方法中引入了同样的问题。

我不明白这背后的逻辑,因为我似乎总是需要添加一个额外的未使用的方法。

我会一直保持这个问题,直到有人提出解释为止。

【问题讨论】:

  • 你确定第二个方法没有在子类中被覆盖吗? (即您确定该代码实际运行吗?)
  • 很遗憾,是的。在我感到沮丧并在这里发布问题之前,我对其进行了多次审查并在邮递员中对其进行了测试。此外,此控制器没有子类
  • “返回空值”是什么意思?来自 count() 方法?
  • 您没有包含构造函数或可以在代码中设置字段的任何其他位置。是否有可能在字段初始化之前调用第二个方法?
  • @daniu "userService" 本身为空,而不是 count() 方法。

标签: java spring spring-boot


【解决方案1】:

你的注册方法是private,改成public。从逻辑上讲,它应该是公共的,因为它是从包外部调用的。

【讨论】:

  • 非常好,这可能是问题所在。我会再次检查并回来将其标记为正确答案。谢谢
  • "register" 方法仍然是私有的,但现在它在添加了 "dontRegister" 方法后可以工作。这对我来说还没有意义,但我会接受这个答案。
猜你喜欢
  • 2017-05-26
  • 2017-05-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-02-01
  • 2015-01-01
  • 1970-01-01
相关资源
最近更新 更多