[英]Spring 3 MVC: @ModelAttribute method + @Autowired not working
我是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;
}
}
上下文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無法正常工作嗎?
請檢查以下內容: 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
作為實例變量並沒有多大意義。 請閱讀此處以獲得更好的理解。
您在這里混淆了幾個Spring概念。
首先, @Component
Component用於程序組件,通常是提供程序其他部分所需的某些服務的對象。 它不適用於諸如Employee
類之類的數據對象,並且不應自動裝配運行時數據(而非配置對象)的數據對象,而應將它們傳遞給對其進行操作的特定方法調用。
@ModelAttribute
告訴Spring,它應該將要注釋的內容添加到MVC Model
對象中,以便控制器和視圖可以使用。 這與@Autowired
完全無關。
這是您的代碼中正在發生的事情:
Employee
類帶有@Component
注釋,因此Spring創建一個單例bean並將其注冊到上下文中。 這個bean從來沒有設置過它的字段,所以它們為null
,但是bean本身存在,所以它被連接到控制器的empl
字段中。 這就是為什么您沒有得到NullPointerException
,如果自動裝配確實不起作用,您將得到NullPointerException
。 @ModelAttribute
由Spring評估,並添加到每個請求的Model
中。 但是,您永遠不會將此模型傳遞給任何控制器,因此他們永遠不會看到它。 ModelAndView
對象,其中沒有任何內容。 empl
的完全不同的空Employee
對象,並在字段上打印出null
值(但不要拋出NullPointerException
因為自動裝配成功了)。 @Autowired不適用於Employee之類的域對象。 在您的情況下,Spring使用默認構造函數創建Employee對象,因此其姓氏為null。 由於Employee類上的@Component注釋,Spring創建了Employee對象,它與@ModelAttribute無關。 用@ModelAttributes注釋的方法指示Spring創建另一個Employee對象,並將其注入到您不必自己創建的Model對象中。 只需從“ returnhome”方法返回“ index”字符串即可。 為了進行調試,您可以將@ModelAttribute Employee e添加為“ returnhome”方法的參數。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.