Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/logging/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 从JSP向控制器提交枚举_Java_Spring_Jsp_Spring Mvc_Enums - Fatal编程技术网

Java 从JSP向控制器提交枚举

Java 从JSP向控制器提交枚举,java,spring,jsp,spring-mvc,enums,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

我有一个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:



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

您不能直接映射
Enum
,请将表单bean类型更改为

private String type;

它将工作

问题是默认的Spring MVC属性编辑器无法确定如何将HTTP请求中提交的
abc
映射到
Type.A
。它关于枚举的默认行为是将字符串值转换为枚举。由于它找不到名为
abc
的枚举值,因此它会使用
null
退出

您可以通过编写自己的
属性编辑器
来克服这一问题

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);
      }
    }
  }
}
最好在enum类
Type
中创建一个方法,从
java.lang.String
中获取
Type
值。之后,属性编辑器代码将得到简化,对枚举值的任何更改都将本地化为
类型

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

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

发布您的UploadFormBean类代码?枚举在哪里?它在JSP中的何处使用?它在控制器中的何处使用?当你说“不能让它工作”时,你是什么意思?你预计会发生什么?到底发生了什么?如果任何“某些代码”部分正在更改或设置与问题相关的内容,则应将其发布。@RE350添加了相关代码。请查看编辑并查看是否有任何更改。让我知道为什么这是不可能的。任何文件都会有帮助。
@Controller
public class MyController {
  @InitBinder
  public void initBinder(WebDataBinder binder) {
    binder.registerCustomEditor(Type.class, new TypeEditor());
  }
}