4

それは単純な問題のはずですが、簡単な解決策を見つけることができませんでした。

Spring Message Resource を使用して、システム上のすべてのテキストを .properties ファイルから提供しています。国際化の質問のためにそれが必要で、Spring のデフォルト メッセージを使用できません。

問題は次のとおりです。

.properties ファイルに次の行があります。

validator_invalid_state_name=Invalid name ({min}, {max})

検証コードは次のとおりです。

@Size( min=3, max=5, message="validator_invalid_state_name" )
public String name;

ただし、無効な値がフィールドに送信されると、メッセージは次のようになります。

「無効な名前 ({min}, {max})」であり、「無効な名前 (3, 5)」ではありません。

いくつかの解決策を試しましたが、成功しませんでした。たとえば、次のとおりです。

@Size( min=3, max=5, message="{validator_invalid_state_name}" )
@Size( min=3, max=5, message="${validator_invalid_state_name}" )
@Size( min=3, max=5, message="Size.name" ) // with "Size.name=Invalid name ({min}, {max})" in my .properties file
@Size( min=3, max=5, message="{Size.name}" ) //idem

しかし、私が使用する場合

@Size( min=3, max=5 )

次に、Spring からデフォルトのメッセージを取得します (これは使用したくありません)。必要なことは非常に単純です。カスタム .properties ファイルから独自のメッセージを使用しますが、@Size アノテーションによって提供されるパラメーターを使用します。

助言がありますか?

前もって感謝します。

4

2 に答える 2

5

キーにアクセスするための適切な構文は次のとおりです。

@Size( min=3, max=5, message="{validator_invalid_state_name}" )

ただし、問題は、デフォルトのセットアップでは、Spring の ValidationMessages.properties に対してではなく、custom.properties に対してキー検索が行われないことです。したがって、起動して実行する最も簡単な方法は、ValidationMessages.properties (および 18n に相当するもの) を作成し、キーを追加することです。

validator_invalid_state_name=Invalid name ({min}, {max})

これが最も簡単な解決策であり、設定に頭を悩ませる必要はありません。

さて、これをプロパティファイルから提供したいので、それは可能ですが、適切な構成を見つける必要があります. Spring 4.x の場合、これは適切な xml および Java 構成になります。

Java 構成

@Bean(name = "messageSource")
public MessageSource messageSource()
{
    ReloadableResourceBundleMessageSource bean = new ReloadableResourceBundleMessageSource();
    bean.setBasename("classpath:text");
    bean.setDefaultEncoding("UTF-8");
    return bean;
}

@Bean(name = "validator")
public LocalValidatorFactoryBean validator()
{
    LocalValidatorFactoryBean bean = new LocalValidatorFactoryBean();
    bean.setValidationMessageSource(messageSource());
    return bean;
}

@Override
public Validator getValidator()
{
    return validator();
}

XML 構成

    <annotation-driven validator="validator">
    <!--i18n filtering-->
    <beans:bean id="messageSource" class="org.springframework.context.support.ReloadableResourceBundleMessageSource">
        <beans:property name="basenames">
            <beans:list>
                <beans:value>classpath:custom</beans:value>
            </beans:list>
        </beans:property>
        <beans:property name="defaultEncoding" value="UTF-8"/>
    </beans:bean>

  <beans:bean id="validator" class="org.springframework.validation.beanvalidation.LocalValidatorFactoryBean">
        <beans:property name="validationMessageSource" ref="messageSource"/>
    </beans:bean>

Spring mvc 3.x の場合、LocalValidatorFactoryBean にvalidationMessageSourceプロパティが見つからないため、メッセージ インターポレーターを作成してセットアップする必要があります。このスレッドhttp://forum.spring.io/forum/spring-projects/web/78675-jsr-303-validation-spring-mvc-and-messages-propertiesに例があります。それが役に立てば幸い

于 2014-11-16T08:41:58.217 に答える
0

JPA 永続性をサポートする Spring Boot を使用している場合、このソリューションは機能しません。システムがスローします。

Caused by: org.springframework.beans.factory.BeanCreationException: Error creating bean with name '(inner bean)#427e977': Cannot resolve reference to bean 'entityManagerFactory' while setting constructor argument; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'entityManagerFactory': Post-processing of FactoryBean's singleton object failed; nested exception is java.lang.IllegalStateException: ApplicationEventMulticaster not initialized - call 'refresh' before multicasting events via the context: org.springframework.boot.context.embedded.AnnotationConfigEmbeddedWebApplicationContext@4f430ea5: startup date [Fri Sep 18 09:33:54 EEST 2015]; root of context hierarchy
at org.springframework.beans.factory.support.BeanDefinitionValueResolver.resolveReference(BeanDefinitionValueResolver.java:359)
at org.springframework.beans.factory.support.BeanDefinitionValueResolver.resolveValueIfNecessary(BeanDefinitionValueResolver.java:108)
at org.springframework.beans.factory.support.ConstructorResolver.resolveConstructorArguments(ConstructorResolver.java:634)
at org.springframework.beans.factory.support.ConstructorResolver.instantiateUsingFactoryMethod(ConstructorResolver.java:444)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.instantiateUsingFactoryMethod(AbstractAutowireCapableBeanFactory.java:1119)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBeanInstance(AbstractAutowireCapableBeanFactory.java:1014)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:504)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:476)
at org.springframework.beans.factory.support.BeanDefinitionValueResolver.resolveInnerBean(BeanDefinitionValueResolver.java:299)
... 96 more

Caused by: org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'entityManagerFactory': Post-processing of FactoryBean's singleton object failed; nested exception is java.lang.IllegalStateException: ApplicationEventMulticaster not initialized - call 'refresh' before multicasting events via the context: org.springframework.boot.context.embedded.AnnotationConfigEmbeddedWebApplicationContext@4f430ea5: startup date [Fri Sep 18 09:33:54 EEST 2015]; root of context hierarchy
at org.springframework.beans.factory.support.FactoryBeanRegistrySupport.getObjectFromFactoryBean(FactoryBeanRegistrySupport.java:116)
at org.springframework.beans.factory.support.AbstractBeanFactory.getObjectForBeanInstance(AbstractBeanFactory.java:1523)
at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:314)
at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:194)
at org.springframework.beans.factory.support.BeanDefinitionValueResolver.resolveReference(BeanDefinitionValueResolver.java:351)
... 104 more
Caused by: java.lang.IllegalStateException: ApplicationEventMulticaster not initialized - call 'refresh' before multicasting events via the context: org.springframework.boot.context.embedded.AnnotationConfigEmbeddedWebApplicationContext@4f430ea5: startup date [Fri Sep 18 09:33:54 EEST 2015]; root of context hierarchy
at org.springframework.context.support.AbstractApplicationContext.getApplicationEventMulticaster(AbstractApplicationContext.java:344)
at org.springframework.context.support.AbstractApplicationContext.publishEvent(AbstractApplicationContext.java:331)
at org.springframework.boot.autoconfigure.orm.jpa.DataSourceInitializedPublisher.postProcessAfterInitialization(DataSourceInitializedPublisher.java:69)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.applyBeanPostProcessorsAfterInitialization(AbstractAutowireCapableBeanFactory.java:422)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.postProcessObjectFromFactoryBean(AbstractAutowireCapableBeanFactory.java:1719)
at org.springframework.beans.factory.support.FactoryBeanRegistrySupport.getObjectFromFactoryBean(FactoryBeanRegistrySupport.java:113)
... 108 more

(私が考えているのは、どういうわけか、spring.datasource ステートメントが配置されている application.properties を見失っているということですが、その理由はわかりません!)。上記のマスタースレーブによって指定されたメッセージソースのユーザー定義を削除し、SpringBoot が提供するメッセージソースを注入することで、これを次の Java 構成で動作させることができました。これにより、ValidationMessages.properties ではなく、messages.properties から検証メッセージが入力されるようになりました

@SpringBootApplication
public class MyApplication extends WebMvcConfigurerAdapter {

@Autowired
MessageSource messageSource;

public static void main(String[] args) {
    SpringApplication.run(MyApplication.class, args);
}

    @Bean(name = "validator")
public LocalValidatorFactoryBean validator()
{
    LocalValidatorFactoryBean bean = new LocalValidatorFactoryBean();
    bean.setValidationMessageSource(messageSource);
    return bean;
}

@Override
public Validator getValidator()
{
    return validator();
}
}
于 2015-09-18T06:44:48.043 に答える