【问题标题】:Autowired failing to load service into classAutowired 无法将服务加载到类中
【发布时间】:2018-06-23 14:33:13
【问题描述】:

在对我的服务进行操作时,我收到一个空指针异常,因为我的服务没有被自动装配到类中。我已经实现了这个类的存储库和服务,与这个应用程序中的其他人完全相同,我以前没有遇到过这个问题。该课程确实警告 Autowire 的问题,但我不知道如何解决它们:

Autowired members must be defined in valid spring bean

同样,这与其他类的设置相同,我没有这个问题。在服务类中,它抱怨存储库无法自动装配到构造函数中,因为有多个相同类型的 bean。我的其他服务类也显示此警告,但在自动装配到类中并对其进行操作时没有问题。以下定义,请询问任何其他有帮助的上下文。

//TransactionCategoryRepository.java
@Repository("transactionCategoryRepository")
public interface TransactionCategoryRepository extends 
CrudRepository<TransactionCategory, Integer> {
}

--

//TransactionCategoryService.java
@Service("transactionCategoryService")
public class TransactionCategoryService {

private TransactionCategoryRepository transactionCategoryRepository;

@Autowired
public TransactionCategoryService(TransactionCategoryRepository repository) {
    this.transactionCategoryRepository = repository;
}

public void saveTransactionCategory(TransactionCategory transactionCategory) {
    transactionCategoryRepository.save(transactionCategory);
}
}

--

//Utilities.java
public class PlaidUtilities {

private Logger logger = 
LoggerFactory.getLogger(PlaidUtilities.class.getSimpleName());

private PlaidClient mPlaidClient;

@Autowired
TransactionCategoryService mTransactionCategoryService;
...

在 TransactionCategoryService.java 中的respository 上引发了多 bean 警告,在 Utilities.java 中引发了 Autowired 定义警告。稍后在 Utilities.java 中操作 mTransactionCategoryService 时出现破坏性空指针异常错误。

【问题讨论】:

  • 如果您有多个符合自动装配组件类型的 bean,您需要使用 @Qualifier 指定您想要的。但这不会给你这个例外,你需要检查你的 bean 是否确实被创建,如果你在某个包中搜索 bean,请确保你的 repo 在正确的包中。
  • @Snickers3192 我很抱歉,但我是 Spring 和 Spring Boot 的新手,并不完全确定你的建议。 search for beans in a certain package 是什么意思?该定义只出现在一个地方,这很奇怪,因为 IntelliJ 似乎意识到了这一点;当它列出 bean 的两个位置时,它列出了相同的位置 (TransactionCategoryRepository.java)。
  • 可能值得重申的是,我有其他存储库和服务以完全相同的方式设置并且没有这个问题。
  • 如果是这种情况,您需要提供更多信息,也许先重做一些东西,看看是否有效。

标签: java spring spring-boot autowired


【解决方案1】:

除非您需要它们,否则请从 @Service@Repository 注释中取出名称。我发现这只会让事情变得尴尬。

另一件可能出错的事情是您没有扫描这些包。您可以通过将启动应用程序属性更改为 @SpringBootApplication(scanBasePackages={"your.package.here"})

在主类中更改它

看看here at this question他们在哪里详细介绍了它

【讨论】:

  • 感谢您的回答。我尝试了您的建议并将基本包添加到主应用程序类中的@SpringBootApplication,但我得到了相同的结果。有什么想法我还可以尝试吗?
  • 我已经意识到,我尝试自动装配到这个特定文件的所有内容都会引发同样的警告,即需要在 spring bean 中定义它。此文件与我之前完成此自动装配的位置不同。你知道我在这种情况下可能做错了什么吗?
  • 你要注入PlaidUtilities吗?我注意到您没有使用ServiceComponent 对其进行注释,因此如果您尝试将其注入某个地方,它将无法正常工作。如果你不想用属性标记它,你可以做的是定义一个用@Configuration标记的类,然后从一个用@Beanlike this注释的方法初始化
  • 啊,不,我还没有将它注释为服务,尽管我确实尝试将它注释为控制器。我仍在努力正确使用这些注释。我通过将它移动到不同的相关控制器来暂时修复它,这很好,因为它可以工作,但不好的是我仍然不明白为什么它不工作。我将尝试在原始类文件中添加服务注释。感谢您的建议。
  • 我会尝试挖掘一些可以很好地解释它的链接。我可以解释它的最好方法是 Spring 有一个提供者(标有@Service@Component 等)和消费者(@Autowired)的注册表。基本上,在任何你通过 setter 或构造函数传入服务的地方,你都可以用@Autowired 标记方法/字段,然后用@Component 标记依赖关系
猜你喜欢
  • 2015-07-15
  • 1970-01-01
  • 1970-01-01
  • 2015-07-23
  • 2017-02-22
  • 2017-02-05
  • 1970-01-01
  • 2018-10-29
  • 2015-08-21
相关资源
最近更新 更多