我在Spring MVC项目中尝试使用@ autowire,@ configuration,@ bean,@ Relot时出现此错误
无法自动装配字段:private com.sachin.dao.StockDaoImpl com.sachin.myapp.HomeController.stockDao;
嵌套异常是org.springframework.beans.factory.NoSuchBeanDefinitionException:找不到依赖的[com.sachin.dao.StockDaoImpl]类型的匹配bean:
请让我知道我犯了什么错误。我是Spring MVC和依赖注入的新手。
这是我的控制器代码。我想在控制器中注入StockDaoImpl。
@Controller
public class HomeController {
@Autowired
private StockDaoImpl stockDao;
@RequestMapping(value = "/stockgoogle/", method = RequestMethod.GET)
public @ResponseBody Stock stockGoogle(Locale locale, Model model) {
//StockDaoImpl stockDao = new StockDaoImpl();
Stock s=stockDao.listGoogle();
model.addAttribute("s", s );
return s;
}
}
我的服务实施如下。我在这里使用了@Repository注释" stockDao"这是我想要注入的控制器中的变量名
@Repository("stockDao")
public class StockDaoImpl implements StockDao {
@Override
public Stock listGoogle() {
Stock s = null;
try {
... //some code
String name = rs.getString("Name");
s = new Stock(name);
...
} catch (Exception e) {
}
return s;
}
}
我也分别创建了一个配置类。我用它来定义我的bean。我只使用它来指定bean,并且没有在代码中的任何地方导入它。
@Configuration
public class BeanConfiguration {
@Bean
public StockDaoImpl stockDao(){
return new StockDaoImpl();
}
}
我在这里遗漏了什么。从查看错误看,工厂看不到@Bean注释。除了注释@configuration类之外,我还需要做其他事吗。
我也可能以错误的方式使用注释。我可能在如何使用@Autowired或@Repository时犯了错误。
你能帮忙吗?
答案 0 :(得分:2)
我认为这可能是你的问题:
“我也分别创建了一个配置类。我使用它来定义我的bean。我只使用它来指定bean并且没有在代码中的任何地方导入它。”
你需要告诉Spring寻找BeanConfiguration
。您可以在applicationContext.xml
文件(假设您有)中执行此操作,如下所示:
<context:component-scan base-package="com.sachin.config" />
这假设BeanConfiguration位于com.sachin.config
包中。
如果找不到放置它的位置,分享您的web.xml文件可能会有所帮助。
答案 1 :(得分:0)
我在测试班上有描述的行为。
我在IntelliJ 2020.1中工作,其旧项目建立在:
Java 1.6
Spring 3.0.5.RELEASE
Maven POM 4.0.0
Maven 3.2.5
测试类的开头为:
@Test
@ContextConfiguration(locations={ "classpath*:beans_sets/UhradyForIns.xml"})
@TransactionConfiguration(transactionManager="transactionManager", defaultRollback=false)
@DirtiesContext(classMode= DirtiesContext.ClassMode.AFTER_EACH_TEST_METHOD)
public class OdeslatJakobyAutomatickyUhraduTest extends TestBaseWithProperties {
private static final Logger log = LoggerFactory.getLogger(OdeslatJakobyAutomatickyUhraduTest.class);
@Autowired
U01UhradaBaseJpaDaoForTesting dao;
有时候,在POM中进行了某些更改之后,Spring不能自动连接dao,以准确显示您的消息。 dao通过其类和XML上下文描述得到了很好的描述,但是对于Spring却是突然不可见的。我尝试过在SO上描述的许多方法,添加批注,更改配置,但是我发现,这都是多余的。我只需要按4个不同的顺序刷新Maven存储库4次:
1. mvn -e -U clean install //In cmd line
2. Ctrl+Shift+A Reimport maven //in IntelliJ
3. double round arrows for refresh //in the maven window of IntelliJ
4. AGAIN REPEAT THE FIRST REFRESH.
在那之后,一切都很好,并且可以正常工作,直到下一次对POM进行更大的更改为止。
或者...由于某些内部原因,Maven或IntelliJ会在没有您参与的情况下损坏本地jar存储库。至少在没有碰到存储库的情况下,我遇到了一个案例,但是再次出现了Could not autowire...
消息。但是这次只有一个
mvn -e -U clean install
足够了。
很显然,IntelliJ中的maven和/或maven插件中存在一些错误。该问题由Could not autowire...
消息显示。可以通过简单的Maven存储库刷新来进行修复,或者在更坏的情况下,需要顺序进行几次不同的存储库刷新。
我知道在该解决方案中没有明显的逻辑,而且我们开发人员的工作越来越像魔术。这次肯定不是你或我的恶习。简单地说,我们必须适应现有的错误。至少我们知道该怎么做。