我是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无效吗?
答案 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”方法的参数。