Spring 将bean自动连接到我的控制器。防止使用getBean方法

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.

我正在尝试一个小应用程序,它对SpringMVC框架还是非常陌生的。我有一个控制器类和一个bean配置xml文件。如果调用getBean()方法,我就能够使用这个bean。然而,我的计划是使用自动连线将bean注入到我的控制器中,而不是使用getBean()。但我有一个错误。我正在使用maven构建我的项目。下面是src/main/java下的包中的控制器类

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 id
mongoTemplate
在您的配置中定义。我想
@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.