1

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

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

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

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

typeMismatch.barcodeInfo=Invalid format

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

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

4

2 回答 2

1

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


笔记:

  • 您应该实现自己的异常(以便能够将其与IllegalArgumentException其他组件的异常区分开来)。
  • 您可以在您的方法中WebDataBinder使用您的自定义初始化(或设置特定于您的处理程序适配器)。BindingErrorProcessor@InitBinderWebBindingInitializer
于 2013-06-08T18:54:40.947 回答
1

正如 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);
        }
      }
    });
  }
}
于 2013-06-09T07:57:17.703 回答