Spring表单绑定 - 使用IllegalArgumentException消息作为错误消息

时间:2013-06-07 09:22:03

标签: spring-mvc spring-webflow

我有一个自定义域类,其中包含一个带有String的构造函数,以及一个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的解决方案。

2 个答案:

答案 0 :(得分:1)

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


注意:

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

答案 1 :(得分:1)

正如帕维尔在回答中提到的,你可以通过实施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);
        }
      }
    });
  }
}