2015-02-06 97 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