Spring Converter,Validator和DataBinder:如何分别处理多值bean字段?

时间:2019-09-27 12:54:18

标签: java spring spring-boot spring-mvc

我有一个bean,其中有一个类型为List的字段。

  public List<MyClass> getter() {
    return field;
  }

  public void setter(MyClass[] source) {
    this.field = Arrays.asList(source);
  }

我已经实现了转换器Converter<String, MyClass>,它也可以工作。如果可以将字符串转换为MyClass,则将其转换,否则,将引发异常,并且FieldError中将包含Errors errors = binder.getBindingResult();的实例。问题在于,FieldError#getRejected方法String具有有效值和无效值的逗号分隔列表,这可能会引起误解。而且没有空间,这很难看。像这样:

Field has invalid value of "valid,invalid"

我希望

Field has invalid value of "invalid"

换句话说,如何使转换和验证分别对每个值起作用?

1 个答案:

答案 0 :(得分:1)

尽管spring的方法不是很聪明,但在逻辑上是正确的。以下代码可以帮助您找到无效值。

            FieldError fieldError = bindingResult.getFieldError();
            if (fieldError != null && fieldError.contains(TypeMismatchException.class)) {
                TypeMismatchException typeMismatchException = fieldError.unwrap(TypeMismatchException.class);
                ConversionFailedException conversionFailedException = findConversionFailedException(typeMismatchException);
                if (conversionFailedException != null) {
                    Object value = conversionFailedException.getValue();
                    // get the invalid field value
                }
            }
    /**
     * Recursively find the ConversionFailedException
     * @param target
     * @return
     */
    public ConversionFailedException findConversionFailedException(Throwable target) {
        Throwable cause = target.getCause();
        if (cause == null) {
            return null;
        } else if (cause instanceof ConversionFailedException) {
            return (ConversionFailedException)cause;
        }
        return findConversionFailedException(target);
    }