0

Я работаю с Spring 4.0.7 и Spring Web Flow 2.4.0Spring Web Flow LocalValidatorFactoryBean (JSR-349) не работает, как ожидается

У меня есть следующие (я работаю с JSR 349):

Для лица:

@Min(value=1, message="{person.age.min}",groups={PersonRegistrationCheck.class}) 
@Max(value=115, message="{person.age.max}",groups={PersonRegistrationCheck.class}) 
@NotNull(message="{field.null}",groups={PersonRegistrationCheck.class}) 
@Column(name="age", nullable=false, length=3) 
@XmlElement 
public Integer getAge() { 
    return age; 
} 

в файле ValidationMessages.properties

person.age.max = Invalid data '${validatedValue}', the maximum value allowed is {value} 
person.age.min = Invalid data '${validatedValue}', the minimum value allowed is {value} 

В некоторых @Configuration

@Bean 
public LocalValidatorFactoryBean localValidatorFactoryBean(ReloadableResourceBundleMessageSource messageSource){ 

    LocalValidatorFactoryBean localValidatorFactoryBean = new LocalValidatorFactoryBean(); 
    localValidatorFactoryBean.setValidationMessageSource(messageSource); 

    MessageSourceResourceBundleLocator msrbl = new MessageSourceResourceBundleLocator(messageSource); 
    ResourceBundleMessageInterpolator rbmi = new ResourceBundleMessageInterpolator(msrbl); 
    localValidatorFactoryBean.setMessageInterpolator(rbmi); 

    return localValidatorFactoryBean; 
} 

Через Spring MVC это работает прекрасно:

<tr> 
    <td><spring:message code="person.form.age"/></td> 
    <td><form:input path="age" size="40"/></td> 
    <td><form:errors path="age" cssClass="error"/></td> 
</tr> 

Если я ставлю недопустимое значение, как 500 я получаю

Неверные данные 500, максимальное значение разрешено 115

Я могу видеть i nvalid и максимальное допустимое значение.

Пока здесь все не в порядке ..

Примечание: это не необходимо сделать специальную инъекцию о LocalValidatorFactoryBean для Spring MVC

Проблема с Spring Web Flow.

Примечание: это необходимо сделать специальную инъекцию о LocalValidatorFactoryBean для Spring Web Flow

Здесь его конфигурации:

@Autowired 
private LocalValidatorFactoryBean localValidatorFactoryBean; 

@Bean 
public FlowBuilderServices flowBuilderServices() { 
    return getFlowBuilderServicesBuilder() 
      .setViewFactoryCreator(mvcViewFactoryCreator()) 
      .setConversionService(conversionService())    
      .setValidator(localValidatorFactoryBean) 
      .setDevelopmentMode(true) 
      .build(); 
} 

Выше практически почти то же самое в соответствии с spring-webflow-samples /WebFlowConfig

В определении потока Тион

<view-state id="start" 
     view="person.flow.form.register" 
     model="person" 
     validation-hints="'com.manuel.jordan...PersonRegistrationCheck'" > 
    <transition on="submit" to="address" bind="true" validate="true" > 
     <evaluate expression="personAction.savePerson(flowRequestContext)" /> 
    </transition> 
    <transition on="cancel" to="end" bind="false" validate="false"/> 
</view-state> 

Снова в .jsp файле

<tr> 
    <td><spring:message code="person.form.age"/></td> 
    <td><form:input path="age" size="40"/></td> 
    <td><form:errors path="age" cssClass="error"/></td> 
</tr> 

Примечание: Это другой или новый файл .jsp, это работать на Spring Web Flow. Поэтому один для работы через Spring MVC и другие для SWF. Это для целей тестирования

Ok проблемы:

Опять Если я ставлю недопустимое значение, как 500 я получаю

Invalid данные $ validatedValue, максимальное допустимое значение является значением

Обратите внимание: мы не можем см., Недействительные данные (остается с $ validatedValue) и value остается как статический.

Поэтому:

  • Spring MVC показывает: Invalid data 500, the maximum value allowed is 115
  • SWF шоу: Invalid data $validatedValue, the maximum value allowed is value

Примечание: Даже если использовать следующий, все пойдет не так же.

@Bean 
public LocalValidatorFactoryBean localValidatorFactoryBean(ReloadableResourceBundleMessageSource messageSource){ 

    LocalValidatorFactoryBean localValidatorFactoryBean = new LocalValidatorFactoryBean(); 
    localValidatorFactoryBean.setValidationMessageSource(messageSource); 

    //MessageSourceResourceBundleLocator msrbl = new MessageSourceResourceBundleLocator(messageSource); 
    //ResourceBundleMessageInterpolator rbmi = new ResourceBundleMessageInterpolator(msrbl); 
    //localValidatorFactoryBean.setMessageInterpolator(rbmi); 

    return localValidatorFactoryBean; 
} 

Что случилось или пропало без вести?

ответ

0

Используя образец booking-mvc, я мог бы подтвердить, что все работает должным образом. Я попробовал оба свойства ValidationMessages.properties с по умолчанию LocalValidatorFactoryBean (то есть без пользовательского интерполятора, просто полагаясь на валидатор Hibernate), а также «/WEB-INF/messages.properties» с настраиваемым ResourceBundleMessageInterpolator, указывающим на ResourceBundleMessageSource.

Несколько нот на выше:

  • setValidationMessageSource и setMessageInterpolator на LocalValidatorFactoryBean являются взаимоисключающими. В джавадоке это четко сказано.

  • ValidationMessages.properties - механизм проверки бонуса по умолчанию (JSR-303). После установки пользовательского MessageInterpolator, ValidationMessages.properties больше не используется.

  • Поддержка $ {validatedValue} кажется чем-то доступным с версией 5+ проверки версии Hibernate, т. Е. Она недоступна в 4.3.

  • В Web Flow мы также смотрим на messages.properties в каталоге потока. Необходимо убедиться, что отсутствуют коды ошибок, которые переопределяют сообщения о нарушениях JSR-303.

С учетом этого все, кажется, работает нормально.

+0

Спасибо Rossen. Позвольте мне проверить это, в эти выходные. –