Java 自动连线依赖项注入失败-无法自动连线字段(Spring)
我正在构建一个应用程序,它通过snarlapi与前端的Springboot连接到Stardog数据库。snarlTemplate的自动连线bean工作正常,但我定义的任何组件都有问题。我已经取出了ValidationDAO的自动连线并将其加载。我已经看过其他有同样问题的帖子,但我找不到解决办法。Java 自动连线依赖项注入失败-无法自动连线字段(Spring),java,spring,spring-mvc,autowired,stardog,Java,Spring,Spring Mvc,Autowired,Stardog,我正在构建一个应用程序,它通过snarlapi与前端的Springboot连接到Stardog数据库。snarlTemplate的自动连线bean工作正常,但我定义的任何组件都有问题。我已经取出了ValidationDAO的自动连线并将其加载。我已经看过其他有同样问题的帖子,但我找不到解决办法。 首先,这里是DAO(我已将其注释为组件)。。。验证是在不同文件中定义的POJO。 src/main/java/validation/ValidationDAO.java @ComponentScan("
首先,这里是DAO(我已将其注释为组件)。。。验证是在不同文件中定义的POJO。
src/main/java/validation/ValidationDAO.java
@ComponentScan("com.complexible.stardog.ext.spring")
@Component
public class ValidationDAO {
private static final Logger logger = LoggerFactory.getLogger(ValidationDAO.class);
@Autowired
public SnarlTemplate snarlTemplate;
public List<Validation> validate() {
// TODO: file input
String query = "SELECT * WHERE { ?s ?p ?o }";
logger.debug("DAO Query: " + query);
List<Validation> results = snarlTemplate.query(query, new RowMapper<Validation>() {
public Validation mapRow(BindingSet bindingSet) {
Validation v = new Validation();
// set results of query
v.setSubject(bindingSet.getValue("s").stringValue());
v.setPredicate(bindingSet.getValue("p").stringValue());
v.setObject(bindingSet.getValue("o").stringValue());
// set error message
v.setError("No given description.");
return v;
}
});
return results;
}
public SnarlTemplate getSnarlTemplate() {
return snarlTemplate;
}
public void setSnarlTemplate(SnarlTemplate snarlTemplate) {
this.snarlTemplate = snarlTemplate;
}
}
@RestController
public class HomeController {
private static final Logger logger = LoggerFactory.getLogger(HomeController.class);
@Autowired
public ValidationDAO validationDAO;
@RequestMapping(value = "/", method = RequestMethod.GET)
public String home(Locale locale, Model model) {
List<Validation> results = validationDAO.validate();
logger.debug("Found " + results.size() + " errors in ontology.");
model.addAttribute("results", results);
return "home";
}
public ValidationDAO getValidationDAO() {
return validationDAO;
}
public void setValidationDAO(ValidationDAO validationDAO) {
this.validationDAO = validationDAO;
}
}
ComponentScan注释应该在配置中,而不是在component类中。我真的不知道它是否有效,它包含一个你没有提到的包 第二点:不要使用现场注入。() 现在回到问题上来:我认为您在xml文件中的组件扫描是错误的,或者您的包有一些令人困惑的名称。但我非常确定这是您的maven/gradle文件路径;)它不应该包含文件路径,而应该只包含包
验证
<context:component-scan base-package="validation"/><context:annotation-config/>
ComponentScan注释应该在配置中,而不是在component类中。我真的不知道它是否有效,它包含一个你没有提到的包 第二点:不要使用现场注入。() 现在回到问题上来:我认为您在xml文件中的组件扫描是错误的,或者您的包有一些令人困惑的名称。但我非常确定这是您的maven/gradle文件路径;)它不应该包含文件路径,而应该只包含包
验证
<context:component-scan base-package="validation"/><context:annotation-config/>
您确定已加载xml配置吗
您确定已加载xml配置吗
我相信是这样,因为当我从ValidationDAO中删除自动连接时,Snarl模板被加载进来了。你认为摆脱XML配置(如他们所说)并使用@configuration类更好吗?就个人而言,我不太喜欢只使用注释的配置。我发现很难追踪所有带注释的类,并且根据各种配置更改接口的实现非常复杂。我对不变的东西使用注释,对可以配置的东西使用XML。所以我的产品配置在一个文件中。我做了一些测试,并用模拟类构建了您的配置。在我看来,xml似乎从未被读取过。只需移动@SpringBootApplication类中的配置注释,就可以发挥神奇的作用。另外,如果您真的加载了xml,它会创建要注入的对象,而您不需要使用componentScan…嗯,这很奇怪。我尝试移动配置注释,但它对我无效。。。我想知道这两者之间有什么不同。我相信是的,因为当我从ValidationDAO中删除自动连接时,Snarl模板被加载进来了。你认为摆脱XML配置(如他们所说)并使用@configuration类更好吗?就个人而言,我不太喜欢只使用注释的配置。我发现很难追踪所有带注释的类,并且根据各种配置更改接口的实现非常复杂。我对不变的东西使用注释,对可以配置的东西使用XML。所以我的产品配置在一个文件中。我做了一些测试,并用模拟类构建了您的配置。在我看来,xml似乎从未被读取过。只需移动@SpringBootApplication类中的配置注释,就可以发挥神奇的作用。另外,如果您真的加载了xml,它会创建要注入的对象,而您不需要使用componentScan…嗯,这很奇怪。我尝试移动配置注释,但它对我无效。。。我想知道两者之间有什么不同。如何在配置中设置ComponentScan?这应该是一个配置java文件吗?对不起,这些注释对我来说是新的,我确信我使用它们的方式不正确。此外,我尝试了“验证”包,但仍然失败。因为您使用的是SpringBoot,所以您可以首先将
@ComponentScan
注释应用到入口点类(启动spring boot应用程序的类)。页面末尾的示例:哦!这很有道理。它仍然没有运行,所以我可能不得不回去重组一切。我认为问题在于XML,所以我可能会尝试删除它,并使用spring配置完成所有工作。我还认为您应该避免使用XML配置文件。在我看来,它们已经没有“主流”用例了。我建议在构建包之后,将您的整个配置(看起来没有那么多;)放在config类中。如果应用程序运行正常,您可以重构配置并将其拆分为多个配置类。谢谢,我将考虑以这种方式重做配置!如何在配置中设置ComponentScan?这应该是一个配置java文件吗?对不起,这些注释对我来说是新的,我确信我使用它们的方式不正确。此外,我尝试了“验证”包,但仍然失败。因为您使用的是SpringBoot,所以您可以首先将@ComponentScan
注释应用到入口点类(启动spring boot应用程序的类)。页面末尾的示例:哦!这很有道理。它仍然没有运行,所以我可能不得不回去重组一切。我认为问题在于XML,所以我可能会尝试删除它,并使用spring配置完成所有工作。我还认为您应该避免使用XML配置文件。在我看来,它们已经没有“主流”用例了。我建议在构建包之后,将您的整个配置(看起来没有那么多;)放在config类中。如果应用程序运行正常,您可以重构并
<context:component-scan base-package="validation"/><context:annotation-config/>