Spring 3 MVC:@ModelAttribute方法+ @Autowired无法正常工作

时间:2014-05-05 16:30:38

标签: java spring spring-mvc web-applications

我是Spring的新手,并试图在SPring MVC中学习@Autowired魔法。我正在尝试使用@ModelAttribute方法和@Autowired的演示应用程序。每次我得到null,这意味着@Autowired没有正常发生。以下是我的尝试:

控制器

@Controller
public class ModelAttributeAutoWiredController {

@Autowired
private Employee empl;

public void setEmpl(Employee empl) {
    this.empl = empl;
}

@RequestMapping(value="/home")
public ModelAndView returnhome(){

    ModelAndView modelView = new ModelAndView("home");
    System.out.println("Employee First Name: " + empl.getFirstName()); // NULL
    return modelView;
}

@RequestMapping(value="/index")
public ModelAndView returnindex(){

    ModelAndView modelView = new ModelAndView("index");
    System.out.println("Employee Last Name: " + empl.getLastName()); // NULL
    return modelView;
}

@ModelAttribute("empl")
public Employee populateEmployee(){
    Employee empl = new Employee();
    empl.setFirstName("XXX");
    empl.setLastName("YYY");
    return empl;
}

}

员工

@Component
public class Employee {

private String firstName;
private String lastName;
public String getFirstName() {
    return firstName;
}
public void setFirstName(String firstName) {
    this.firstName = firstName;
}
public String getLastName() {
    return lastName;
}
public void setLastName(String lastName) {
    this.lastName = lastName;
}
}

context xml

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:p="http://www.springframework.org/schema/p"
xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="http://www.springframework.org/schema/beans
    http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
    http://www.springframework.org/schema/context
    http://www.springframework.org/schema/context/spring-context-3.0.xsd">

<context:annotation-config />
<context:component-scan
    base-package="com.pack" />

<bean id="viewResolver"
    class="org.springframework.web.servlet.view.UrlBasedViewResolver">
    <property name="viewClass"
        value="org.springframework.web.servlet.view.JstlView" />
    <property name="prefix" value="/WEB-INF/pages/" />
    <property name="suffix" value=".jsp" />
</bean>
</beans>

有人可以帮我解决上面的代码并让我理解为什么@Autowired无效吗?

3 个答案:

答案 0 :(得分:1)

请检查:http://www.mkyong.com/spring-mvc/spring-3-mvc-and-xml-example/

您需要在context.xml文件中使用<mvc:annotation-driven/><context:component-scan base-package="com.your.package" />

看起来这是不可能的,如果你考虑一下,将@ModelAttribute作为实例变量没有多大意义。请阅读here以便更好地理解。

答案 1 :(得分:1)

你在这里混淆了几个Spring概念。

首先,@Component用于程序组件,通常是提供程序其他部分所需服务的对象。 not 用于数据对象(例如Employee类),而运行时数据(而非配置对象)的数据对象不应自动装配,应将它们传递给对它们进行操作的特定方法调用。

@ModelAttribute告诉Spring它应该将正在注释的任何内容添加到MVC Model对象中,以便它可供控制器和视图使用。这与@Autowired无关。

以下是您的代码中发生的事情:

  • 您的Employee类已注释@Component,因此Spring会创建一个单例bean并在上下文中注册它。这个bean永远不会设置它的字段,因此它们是null,但bean本身存在,因此它连接到控制器的empl字段。这就是为什么你没有得到NullPointerException,如果自动装配真的不起作用你就会这样。
  • 您的@ModelAttribute由Spring评估,并针对每个请求添加到Model。但是,您永远不会将此模型传递给任何控制器,因此他们永远不会看到它。
  • 您的控制器方法会创建新的空ModelAndView个对象,但不包含任何内容。
  • 然后,他们读取注入Employee的完全不同的空empl对象,并在字段上打印null值(但不要抛出NullPointerException因为自动装配成功了。)

答案 2 :(得分:1)

@Autowired不适用于像Employee这样的域对象。 在您的情况下,Spring使用默认构造函数创建一个Employee对象,因此其姓氏为null。由于Employee类上的@Component注释,Spring创建了Employee对象,它与@ModelAttribute无关。 使用@ModelAttributes注释的方法指示Spring创建另一个Employee对象并将其注入您不必自己创建的Model对象。 只需从“returnhome”方法返回“index”字符串。 对于调试,您可以将@ModelAttribute Employee e添加为“returnhome”方法的参数。