【问题标题】:Spring form tags. Allow nulls in form:select (enum)弹簧形式标签。允许表单中的空值:选择(枚举)
【发布时间】:2013-11-12 21:33:23
【问题描述】:

我正在使用 Spring 表单标签来填充表单值。

我有表单支持对象:

public class FormInfo {
  public enum Status {ON, OFF}

  private Satus status;
  //getter setter
  ...
}

在 JSP 中 Status 枚举是这样呈现的:

<form:form commandObject="formInfo " ...>
     <form:select path="status">
        <form:option value="null" label="Please select"/>
        <form:options/>
     </form:select>
</form:form>

一切正常,即默认消息和枚举值显示在 &lt;select&gt; 中。

但状态字段不是必需的,所以我希望允许用户不选择状态字段。但是如果表单提交时没有选择状态字段,那么我会收到错误:

字段“状态”上的对象“formInfo”中的错误:拒绝值 [null];

如何在未选择任何值时将枚举设置为 null?

请注意,我使用的是 JSR 303 验证。并且上述错误不会自动发生,我通过以下方法手动获取此错误消息BindingResult#getFieldErrors()

这是我的控制器代码:

    public void myMethod(@Valid @ModelAttribute("formInfo") FormInfo sourcingDetail, BindingResult bindingResult) {
          if (bindingResult.hasErrors()) {
              log.error("Error during validation is occurred." + bindingResult.getFieldErrors().toString()); // <-- this is error message
          }
        ...
    }

另外请注意,我没有在 status 字段上设置任何 JSR-303 注释(如 @NotNull)。

更新:

我通过调用此方法BindingResult#getFieldErrors() 得到的几乎完整的错误消息(如上所述):

验证期间发生错误。[对象“formInfo”中的字段错误 在字段“状态”上:拒绝值 [null];

...

[无法将“java.lang.String”类型的属性值转换为 属性“状态”的必需类型“com.my.project.model.Status”; 嵌套异常是 java.lang.IllegalStateException: 无法转换 [java.lang.String] 类型的值到所需类型 [com.my.project.model.Status] 属性“状态”:无匹配 找到编辑器或转换策略],

【问题讨论】:

  • 这是完整的错误吗?它看起来不像是 Bean 验证错误。你有堆栈跟踪吗?
  • @Hardy 我更新了问题(向控制器方法添加了完整的错误消息和附加代码)。请审查它。谢谢。
  • 看起来这是一个转换错误。前端给你一个字符串作为状态,但你需要一个 emum 类型。据我所知,与 Bean Validation 无关。我不确定 JSF 如何以及是否可以为您进行转换。

标签: spring jsp enums jstl


【解决方案1】:

看来你和我有同样的问题!

控制器中有一个方法可用作挂钩,您可以在其中指定如何将来自 HTTP 请求的字符串值转换为具体对象!。 该方法称为 initBinder,您可以在其中附加正确的行为以正确进行转换。我仍在研究,但到目前为止,看起来不错。

看看这个:

希望它有助于找到解决方案!

问候

维克多。

【讨论】:

  • 还刚刚发现枚举的默认绑定器将“”转换为 null,至少对于 Spring 2.5!
猜你喜欢
  • 2013-11-15
  • 1970-01-01
  • 1970-01-01
  • 2019-03-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-05-18
  • 1970-01-01
相关资源
最近更新 更多