2012-10-04 41 views
1

選項項目的錯誤枚舉被定義爲:爲什麼會使用此枚舉在JSTL

public enum Country { 
    US("United States"), 
    CA("Canada"), 
    AUS("Australia"); 

    private String fullName; 

    private Country(String fullName) { 
     this.fullName = fullName; 
    } 

    public String getFullName() { 
     return fullName; 
    } 

    public void setFullName(String fullName) { 
     this.fullName = fullName; 
    } 
} 

的型號是:

public class Workspace implements Serializable { 
    // ... 
    @Valid 
    @NotNull 
    private Address address; 
    //... 
} 

public class Address implements Serializable { 
    // ... 
    private Country country; 
    //... 
} 

我有一個視圖對象爲這樣的:

public class WorkspaceVO implements Serializable { 
    //.. 
    private Workspace workspace; 
    //... 
} 

最後,在我的jsp我試圖做的事:

<form:select id="country" path="workspace.address.country"> 
    <form:options items="${workspace.address.country}" itemLabel="fullName"/> 
</form:select> 

我有這種確切的情況在我的代碼中的其他地方重複,並且工作正常。我沒有看到任何區別,但是,當我訪問jsp時出現錯誤...

javax.servlet.jsp.JspException:類型[com.mycompany.web.Country]無效選項

任何想法爲什麼?

+0

這是否幫助? http://stackoverflow.com/questions/6014280/select-in-spring-mvc-by-enum – MarkOfHall

回答

1

這是一個簡單的錯誤:form:options items是包含所有選項的列表的值!

所以在控制器,一個變量添加到您的modelmap

modelMap.add("aviableCountries", Country.values); 

,然後在JSP中使用它:

<form:select id="country" path="workspace.address.country"> 
    <form:options items="${aviableCountries}" itemLabel="fullName"/> 
</form:select> 

編輯:一個其他的解決辦法是刪除完全屬性items

<form:select id="country" path="workspace.address.country"> 
    <form:options itemLabel="fullName"/> 
</form:select> 

那麼你不需要在控制器中添加枚舉值。這起作用是因爲spring-form:options -Tag的一個不爲人所知的特徵。在TLD的items值,你可以閱讀:

...這個屬性(項目)是必需的,除非在這種情況下,用於數據綁定是一個枚舉,含選擇的屬性枚舉的價值觀。

org.springframework.web.servlet.tags.form.OptionsTag的代碼,你會發現這個if語句:

if (items != null) { 
    itemsObject = ...; 
} else { 
    Class<?> selectTagBoundType = ((SelectTag) findAncestorWithClass(this, SelectTag.class)) 
      .getBindStatus().getValueType(); 
     if (selectTagBoundType != null && selectTagBoundType.isEnum()) { 
      itemsObject = selectTagBoundType.getEnumConstants(); 
     } 
} 
+0

答案的第一部分,你建議將枚舉添加到模型映射中並不是我一直在尋找的東西。 ..它不應該被添加這種方式。我做了非常類似的其他設置在其他頁面上使用此代碼,就像我在這裏做的,它工作正常。 – kasdega

+0

然而,你的編輯確實給了我一個可行的選擇。當我在其他三個頁面上具有基本相同的代碼並且它們都按預期工作時,仍然很奇怪它在此頁面上不起作用。 – kasdega

+0

@ kasdega:那麼必須有一些你沒有在問題中描述的其他效果。相信我我昨天和今天都仔細查看了彈簧選項標籤的代碼。 – Ralph