簡體   English   中英

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

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM