2015-02-06 69 views
0

我在JSP中有一個要提交給控制器的表單。現在,該表單的一個屬性是一個枚舉,但我無法得到這個工作。從JSP提交枚舉到控制器

public class UploadFormBean { 
    private Type type; 
    public enum Type { 
     A ("abc"), 

     B ("xyz"), 

     C ("pqr"); 

     private final String str; 

     private Type(final String str) { 
      this.str = str; 
     } 

     @Override 
     public String toString() { 
      return str; 
     } 
    } 

    public Type getType() { 
     return type; 
    } 

    public void setType(final String type) { 
     for (Type s: Type.values()) { 
      if (s.toString().equalsIgnoreCase(type)) { 
       this.type = s; 
      } 
     } 
    } 
} 

控制器:

public ModelAndView execute(final HttpServletRequest request, @ModelAttribute final UploadFormBean uploadFormBean) { 
    //some code. 
    Type t = uploadFormBean.getType(); //t is null. 
    //some more code. 
} 

JSP:

<input type="hidden" name="type" value="abc"> 

我在想什麼。讓我知道是否需要任何信息。感謝所有幫助。

+0

發佈UploadFormBean類代碼? – RE350 2015-02-06 20:43:48

+0

枚舉在哪裏? JSP在哪裏使用?控制器在哪裏使用?當你說「無法工作」時,你的意思是什麼?你期望發生什麼?究竟發生了什麼?如果任何「部分代碼」部分正在更改或設置與問題相關的任何內容,則應將其張貼。 – RealSkeptic 2015-02-06 20:50:08

+0

@ RE350添加了相關代碼。 – 2015-02-07 06:04:07

回答

0

的問題是,默認的Spring MVC的屬性編輯器無法確定如何映射在提交abc HTTP請求Type.A。它關於枚舉的默認行爲是將字符串值轉換爲枚舉。由於它無法找到一個名爲abc的枚舉值,因此它將以null進行保護。

你可以通過編寫自己的PropertyEditor來解決這個問題。

public class TypeEditor extends java.beans.PropertyEditorSupport { 
    @Override 
    public void setAsText(String text) throws IllegalArgumentException { 
    if(text != null) { 
     text = text.trim(); 
     if(text.equalsIgnoreCase("abc")) { 
     setValue(Type.A); 
     } 
     else if(text.equalsIgnoreCase("xyz")) { 
     setValue(Type.B); 
     } 
     else if(text.equalsIgnoreCase("pqr")) { 
     setValue(Type.C); 
     } 
    } 
    } 
} 

這可能是最好創建的枚舉類Type一個方法來獲得從java.lang.String一個Type值。之後,屬性編輯器代碼將變得簡化,並且對枚舉值的任何更改將本地化爲Type類。

然後,將此編輯器添加到控制器類中的Web活頁夾中。

@Controller 
public class MyController { 
    @InitBinder 
    public void initBinder(WebDataBinder binder) { 
    binder.registerCustomEditor(Type.class, new TypeEditor()); 
    } 
} 
0

不能直接映射Enum,改變你的form bean類型

private String type; 

,將工作

+0

請參閱編輯並查看是否有任何更改。讓我知道爲什麼這是不可能的。任何文檔都會有所幫助。 – 2015-02-07 06:05:08