【问题标题】:Spring form binding - use IllegalArgumentException message as error messageSpring 表单绑定 - 使用 IllegalArgumentException 消息作为错误消息
【发布时间】:2013-06-10 23:06:46
【问题描述】:

我有一个自定义域类,它带有一个接受字符串的构造函数,以及一个 toString() 方法。构造函数解码输入字符串,对其执行验证,如果无效则抛出 IllegalArgumentException。

我想直接绑定到此字段,如下所述:http://blog.springsource.org/2009/11/17/spring-3-type-conversion-and-validation/(请参阅“配置上的约定”部分)。

一切正常,我正在显示 Spring 解决的错误消息 (typeMismatch on barcodeInfo)。

我知道我可以使用 messageSource 条目自定义此错误消息,例如

typeMismatch.barcodeInfo=Invalid format

但是,我想要显示的错误消息并不总是相同的,它取决于输入字符串的值。因此,我想显示我最初在从构造函数中抛出的 IllegalArgumentException 中使用的错误消息。这可能吗?

我正在专门寻找一种适用于 Spring WebFlow 的解决方案。

【问题讨论】:

    标签: spring-mvc spring-webflow


    【解决方案1】:

    您可能需要检查WebDataBinder 使用的BindingErrorProcessor。在那里,您可以实现自己的自定义逻辑,将异常转换为验证错误。


    注意事项:

    • 您应该实现自己的异常(以便能够将其与其他组件所引发的IllegalArgumentException 区分开来)。
    • 您可以在您的@InitBinder 方法中使用您的自定义BindingErrorProcessor 初始化WebDataBinder(或为您的处理程序适配器设置特定的WebBindingInitializer)。

    【讨论】:

    • 感谢您的回答 - 我更新了答案以指定我专门寻找 Spring WebFlow 的解决方案。不幸的是,经过更多调查,我认为这是不可能的。因此,我接受这个答案,因为它回答了最初的问题。
    【解决方案2】:

    正如 Pavel 在他的回答中提到的,您可以通过实现 BindingErrorProcessor 来实现这一点。

    应该是这样的:

    ...
    import org.springframework.validation.DefaultBindingErrorProcessor;
    ...
    
    @Controller
    public class YourController {
    
      ...
    
      @InitBinder
      public void initBinder(WebDataBinder binder) {
        binder.setBindingErrorProcessor(new DefaultBindingErrorProcessor() {
          @Override
          public void processPropertyAccessException(
              PropertyAccessException ex, BindingResult bindingResult) {
            if (ex.getPropertyName().equals("fieldInQuestion")) {
              Throwable cause = ex.getMostSpecificCause();
    
              FieldError fieldError;
              fieldError = new FieldError(
                bindingResult.getObjectName(),
                "fieldInQuestion",
                cause.getMessage());
    
              bindingResult.addError(fieldError);
            } else {
              super.processPropertyAccessException(ex, bindingResult);
            }
          }
        });
      }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多