一千萬個為什麽

搜索

當選定選項具有空值時,將嵌套對象設置為null

我有一個模擬用戶的類和另一個模擬他的國家的類。像這樣的東西:

public class User{
    private Country country;
    //other attributes and getter/setters
}

public class Country{
    private Integer id;
    private String name;
    //other attributes and getter/setters
}

我有一個彈簧表單,我有一個組合框,所以用戶可以選擇他的國家或可以選擇未定義的選項,以表明他不想提供這些信息。所以我有這樣的事情:

<form:select path="country">
    <form:option value="">-Select one-
    <form:options items="${countries}" itemLabel="name" itemValue="id"/>

在我的控制器中,我獲得了帶有用戶信息的自動填充對象,並且我希望在選擇“-Select one-”選項時將country設置為null。所以我用這樣的自定義編輯器設置了一個initBinder:

@InitBinder
protected void initBinder(WebDataBinder binder) throws ServletException {
    binder.registerCustomEditor(Country.class, "country", new CustomCountryEditor());
}

我的編輯做了這樣的事情:

public class CustomCountryEditor(){
    @Override
    public String getAsText() {
        //I return the Id of the country 
    }

    @Override
    public void setAsText(String str) {
        //I search in the database for a country with id = new Integer(str)
        //and set country to that value
        //or I set country to null in case str == null
    }
}

當我提交表單時,它是有效的,因為當我選擇時,我將國家/地區設置為null  “ - 選擇一個 - ”選項或所選國家/地區的實例。問題是當我加載表單時,我有一個類似下面的方法來加載用戶信息。

@ModelAttribute("user")
public User getUser(){
   //loads user from database
}

我從getUser()獲取的對象將國家/地區設置為特定國家/地區(不是空值),但在組合框中未選擇任何選項。我已經調試了應用程序,並且CustomCountryEditor在設置和獲取文本時工作正常,但是對於“國家/地區”字段中的每個項目都調用了“asAsxt”方法。

任何想法? 當我在組合框中選擇無國家選項時,是否有更好的方法將國家/地區對象設置為null?

謝謝

最佳答案

問題是我從Spring Security主體對象中檢索對象User。我已經改變了我的getUser方法,所以我從Spring Security獲得Id,我在數據庫中搜索,現在一切正常,但我不明白為什麽會發生這種情況,因為我可以在調試中看到該國家是由Spring加載的安全。

轉載註明原文: 當選定選項具有空值時,將嵌套對象設置為null