Spring 将bean自动连接到我的控制器。防止使用getBean方法
我正在尝试一个小应用程序,它对SpringMVC框架还是非常陌生的。我有一个控制器类和一个bean配置xml文件。如果调用getBean()方法,我就能够使用这个bean。然而,我的计划是使用自动连线将bean注入到我的控制器中,而不是使用getBean()。但我有一个错误。我正在使用maven构建我的项目。下面是src/main/java下的包中的控制器类Spring 将bean自动连接到我的控制器。防止使用getBean方法,spring,maven,autowired,Spring,Maven,Autowired,我正在尝试一个小应用程序,它对SpringMVC框架还是非常陌生的。我有一个控制器类和一个bean配置xml文件。如果调用getBean()方法,我就能够使用这个bean。然而,我的计划是使用自动连线将bean注入到我的控制器中,而不是使用getBean()。但我有一个错误。我正在使用maven构建我的项目。下面是src/main/java下的包中的控制器类 package com.eat.menu.controller; import java.util.Date; import org.
package com.eat.menu.controller;
import java.util.Date;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.ApplicationContext;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.support.GenericXmlApplicationContext;
import org.springframework.data.mongodb.core.MongoOperations;
import org.springframework.data.mongodb.core.MongoTemplate;
import org.springframework.data.mongodb.core.query.Criteria;
import org.springframework.data.mongodb.core.query.Query;
import org.springframework.stereotype.Controller;
import org.springframework.ui.ModelMap;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import com.eat.admin.config.Globals.DishCategory;
import com.eat.admin.config.Globals.MenuStatus;
import com.eat.menu.model.Dish;
import com.eat.menu.model.Menu;
@Controller
public class MenuController {
private static int counter = 0;
private static final String VIEW_INDEX = "index";
private final static org.slf4j.Logger logger =
LoggerFactory.getLogger(MenuController.class);
@Autowired
private MongoTemplate mongoTemplate;
public MongoTemplate getMongoTemplate() {
return mongoTemplate;
}
public void setMongoTemplate(MongoTemplate mongoTemplate) {
this.mongoTemplate = mongoTemplate;
}
@RequestMapping(value = "/", method = RequestMethod.GET)
public String welcome(ModelMap model) {
model.addAttribute("message", "Welcome");
model.addAttribute("counter", ++counter);
logger.debug("[welcome] counter : {}", counter);
// Spring uses InternalResourceViewResolver and return back index.jsp
return VIEW_INDEX;
}
@RequestMapping(value = "/{name}", method = RequestMethod.GET)
public String welcomeName(@PathVariable String name, ModelMap model) {
model.addAttribute("message", "Welcome " + name);
model.addAttribute("counter", ++counter);
logger.debug("[welcomeName] counter : {}", counter);
return VIEW_INDEX;
}
@RequestMapping(value = "/menu", method = RequestMethod.GET)
public String createMenu(ModelMap model) {
ApplicationContext ctx = new GenericXmlApplicationContext("BaseConfig.xml");
//Avoid using this
MongoOperations mongoOperation = (MongoOperations) ctx.getBean("mongoTemplate");
Dish dish1 = new Dish();
Date now = new Date();
dish1.setName("Butter Chicken");
dish1.setCategory(DishCategory.ENTREE);
dish1.setCreateDate(now);
dish1.setUpdateDate(now);
Dish dish2 = new Dish();
dish2.setName("Korma Chicken");
dish2.setCategory(DishCategory.ENTREE);
dish2.setCreateDate(now);
dish2.setUpdateDate(now);
Dish [] dishes = new Dish[2];
dishes[0] = dish1;
dishes[1] = dish2;
Menu menu = new Menu();
menu.setCompanyId(1);
menu.setCreateDate(now);
menu.setUpdateDate(now);
menu.setDishes(dishes);
menu.setMenuStatus(MenuStatus.ACTIVE);
mongoOperation.save(menu);
Query searchMenuQuery = new Query(Criteria.where("companyId").is(1));
// find the saved user again.
Menu m = mongoOperation.findOne(searchMenuQuery, Menu.class);
return VIEW_INDEX;
}
}
这是我的baseConfig.xml,位于src/main/resources下
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:mongo="http://www.springframework.org/schema/data/mongo"
xsi:schemaLocation="http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context.xsd
http://www.springframework.org/schema/data/mongo
http://www.springframework.org/schema/data/mongo/spring-mongo.xsd
http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd">
<context:annotation-config/>
<mongo:mongo host="127.0.0.1" port="27017" />
<mongo:db-factory dbname="eatMongoDB" />
<bean id="mongoTemplate" class="org.springframework.data.mongodb.core.MongoTemplate">
<constructor-arg name="mongoDbFactory" ref="mongoDbFactory" />
</bean>
<bean id="menuController" class="com.eat.menu.controller.MenuController">
<property name="mongoTemplate" value="mongoTemplate"/>
</bean>
为了清晰起见,我添加了3个配置文件,如果需要,请告诉我:第一个是pom文件:
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
4.0.0
com.eat
EatApp
战争
1.0-快照
EatApp Maven Webapp
1.8
4.3.2.1发布
1.2
4.12
1.1.7
1.7.21
javax.servlet
javax.servlet-api
3.1.0
假如
朱尼特
朱尼特
${junit.version}
测试
org.slf4j
jcl-over-slf4j
${jcl-over-slf4j.version}
回写
回归经典
${logback.version}
org.springframework
弹簧芯
${spring.version}
公用记录
公用记录
org.springframework
弹簧网
${spring.version}
org.springframework
SpringWebMVC
${spring.version}
org.springframework
spring上下文
${spring.version}
org.mongodb
mongo java驱动程序
3.3.0
org.springframework.data
spring数据mongodb
1.9.2.1发布
jstl
jstl
${jstl.version}
cglib
cglib
3.2.4
EatApp
org.apache.maven.plugins
maven eclipse插件
2.10
真的
假的
2
org.apache.maven.plugins
maven编译器插件
3.5.1
${jdk.version}
${jdk.version}
web.xml文件:
<!-- <!DOCTYPE web-app PUBLIC
"-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"
"http://java.sun.com/dtd/web-app_2_3.dtd" >
-->
<web-app xmlns="http://java.sun.com/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
version="2.5">
<display-name>EatApp Web Application</display-name>
<servlet>
<servlet-name>mvc-dispatcher</servlet-name>
<servlet-class>
org.springframework.web.servlet.DispatcherServlet
</servlet-class>
<!--
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>
/WEB-INF/BaseConfig.xml
</param-value>
</init-param>
-->
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>mvc-dispatcher</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>/WEB-INF/mvc-dispatcher-servlet.xml</param-value>
</context-param>
<listener>
<listener-class>
org.springframework.web.context.ContextLoaderListener
</listener-class>
</listener>
</web-app>
EatApp Web应用程序
mvc调度器
org.springframework.web.servlet.DispatcherServlet
1.
mvc调度器
/
上下文配置位置
/WEB-INF/mvc-dispatcher-servlet.xml
org.springframework.web.context.ContextLoaderListener
以及servlet文件:mvc dispatch servlet:
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="
http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context.xsd">
<context:component-scan base-package="com.eat.menu.controller" />
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="prefix">
<value>/WEB-INF/pages/</value>
</property>
<property name="suffix">
<value>.jsp</value>
</property>
</bean>
/WEB-INF/pages/
.jsp
如果要使用注释,必须在配置中定义组件扫描,您可以告诉spring哪个软件包需要此自动扫描
<context:component-scan base-package="com.xxx.xxx"/>
检查您的MongoTemplatebean,可能它甚至不存在,或者您的spring容器找不到它
@Autowired()
@Qualifier("mongoTemplate")
private MongoTemplate mongoTemplate; // Autowired. Inject by type. if you want to inject by name, you must add @Qualifier() annotation.
@资源
按名称注入。如果您想按名称注入
@Resource(name="mongoTemplate")
private MongoTemplate mongoTemplate; // Resource. Inject by name.
最重要的是@Resource
属于J2EE
,@Autowired
属于Spring
。两者都能解决问题,但是
如果你想办法,你会更好。希望这对您有所帮助。您似乎只在contextConfigLocation参数中设置了配置文件/WEB-INF/mvc-dispatcher-servlet.xml。将baseConfig.xml的内容添加到该文件中,然后重试。如果这解决了问题,那么以后,您可以设法使用多个配置文件。为什么要使用@Autowired和setter注入?即使我不使用它,它仍然会给我上述错误删除MongoTemplate的getter/setter
,从
中删除
。如果它仍然不起作用,那就是您没有包含它,或者它不是您实际运行的代码(比如“baseConfig”与“baseConfig”之间的差异)。您有其他XML配置文件吗?你确定你的MVC应用程序也使用BaseConfig.xml吗?我还是这么做的。我添加了pom文件、web.xml和servlet文件。如果配置中缺少任何内容,请告诉我。ThanksAutowiring by name几乎违背了使用IoC的目的,并且由于应用程序的脆弱性,使得重构变得极其困难。这个建议也不能解决问题,所以它更多的是一个评论,而不是一个答案。不,所有这些似乎都不起作用。它无法识别mongoTemplate bean。似乎它可能与配置有关,但我不确定如何定义,因为我已经在baseConfig.xml中定义了我的bean,并且我已经将该文件放在java/main/resources中。我的理解是,资源下的任何内容都由Springmvc读取。如果不是这样,请告诉我如何包含baseConfig.xml文件,以便其中声明的bean可用。@sirajnadwar bean idmongoTemplate
在您的配置中定义。我想@Autowired@Qualifier(“mongoTemplate”)私有mongoTemplate mongoTemplate代码>就足够了。或@Resource(name=“mongoTemplate”)私有mongoTemplate mongoTemplate代码>
No qualifying bean of type [org.springframework.data.mongodb.core.MongoTemplate] found for dependency [org.springframework.data.mongodb.core.MongoTemplate]: expected at least 1 bean which qualifies as autowire candidate for this dependency. Dependency annotations: {@org.springframework.beans.factory.annotation.Autowired(required=true)}
at org.springframework.beans.factory.support.DefaultListableBeanFactory.raiseNoMatchingBeanFound(DefaultListableBeanFactory.java:1406)
@Autowired()
@Qualifier("mongoTemplate")
private MongoTemplate mongoTemplate; // Autowired. Inject by type. if you want to inject by name, you must add @Qualifier() annotation.
@Resource(name="mongoTemplate")
private MongoTemplate mongoTemplate; // Resource. Inject by name.