将JSP中的枚举提交给控制器

时间:2015-02-06 20:38:11

标签: java spring jsp spring-mvc enums

我在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">

我错过了什么。如果需要任何信息,请告诉我。感谢您的帮助。

2 个答案:

答案 0 :(得分:0)

您无法直接映射Enum,将表单bean类型更改为

private String type;

它会起作用

答案 1 :(得分:0)

问题是默认的Spring MVC属性编辑器无法确定如何将HTTP请求中提交的abc映射到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中创建一个方法,以便从Type获取java.lang.String值。之后,属性编辑器代码将得到简化,对枚举值的任何更改都将本地化为Type类。

然后,将此编辑器添加到控制器类中的Web绑定器。

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