2013-06-07 1 views
0

У меня есть собственный класс домена с единственным конструктором, который принимает строку, а также метод toString(). Конструктор декодирует входную строку, выполняет проверки на ней и выдает IllegalArgumentException, если это недействительно.Связывание с пружиной - используйте сообщение IllegalArgumentException как сообщение об ошибке

Я хочу напрямую связать это поле, как описано здесь: http://blog.springsource.org/2009/11/17/spring-3-type-conversion-and-validation/ (см. Раздел «Конвенция по конфигурации»).

Это нормально работает & Я показываю сообщение об ошибке, разрешенное весной (typeMismatch on barcodeInfo).

Я знаю, что я могу настроить это сообщение об ошибке, используя запись messageSource, например.

typeMismatch.barcodeInfo=Invalid format 

Однако сообщение об ошибке, что я хочу, чтобы отобразить это не всегда то же самое, это зависит от значения входной строки. Следовательно, я хочу отобразить сообщение об ошибке, которое я изначально использовал в исключении IllegalArgumentException, которое я выбрал из конструктора. Это возможно?

Я специально ищу решение, которое будет работать с Spring WebFlow.

ответ

0

Возможно, вы захотите проверить BindingErrorProcessor, используемый WebDataBinder. Там вы можете реализовать свою собственную логику для перевода исключений на ошибки проверки.


Примечания:

  • Вы должны реализовать собственные исключения (чтобы быть в состоянии отличить его от IllegalArgumentException thorwn другими компонентами).
  • Вы можете инициализировать WebDataBinder с помощью своего заказа BindingErrorProcessor в рамках вашего метода @InitBinder (или указать WebBindingInitializer на ваш адаптер адаптера).
+0

Спасибо за ваш ответ - я обновил ответ, чтобы указать, что я специально искал решение для Spring WebFlow. К сожалению, после дальнейшего расследования я не думаю, что это возможно. Следовательно, я принимаю этот ответ, поскольку он отвечает на начальный вопрос. –

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); 
     } 
     } 
    }); 
    } 
}