検証メッセージの解決に問題があります。
私はウェブを検索して読んでおり、SOここ数時間、質問を 春の検証エラーのカスタマイズ
MessageSource
Beanが定義されており、messages.propertiesが正しく読み取られます。通常のテキストにも使用されます。 _th:text="#{some.prop.name}
_で表示されます。これは完全に機能します。検証エラーが原因で正常に機能しません。私は見落としているだけの愚かな間違いだと確信しています...検証自体はうまくいきます。
制約:
_@NotEmpty(message="{validation.mail.notEmpty}")
@Email()
private String mail;
_
messages.properties:
_# Validation
validation.mail.notEmpty=The mail must not be empty!
_
テンプレート部分:
_<span th:if="${#fields.hasErrors('mail')}" th:errors="*{mail}"></span>
_
表示されるテキスト:
_{validation.mail.notEmpty}
_
私は多くのバリエーションを試しましたが、すべて成功しませんでした。
_@NotEmpty(message="validation.mail.notEmpty")
@NotEmpty(message="#{validation.mail.notEmpty}")
_
メッセージ文字列の正確な値を表示するだけで、解析はしません。
_<span th:if="${#fields.hasErrors('mail')}" th:errors="${mail}"></span>
<span th:if="${#fields.hasErrors('mail')}" th:errors="#{mail}"></span>
<span th:if="${#fields.hasErrors('mail')}" th:errors="#{*{mail}}"></span>
<span th:if="${#fields.hasErrors('mail')}" th:errors="#{__*{mail}__}"></span>
_
エラーになります。
編集:
デバッグ後、私はこれにつまずいた:
クラス:_org.springframework.context.support.MessageSourceSupport
_
メソッド:formatMessage(String msg, Object[] args, Locale locale)
と呼ばれます
formatMessage("{validation.mail.notEmpty}", null, locale /*German Locale*/)
そして、if (messageFormat == INVALID_MESSAGE_FORMAT) {
にぶつかります
だから...私のメッセージ形式は正しくありません。これは私の範囲/知識から外れています。誰がそれが意味することを知っていますか?
アプリケーション構成にLocalValidatorFactoryBean
定義が欠落しているようです。以下に、Application
と_messages.properties
_ファイルを使用するLocalValidatorFactoryBean
の2つのBeanを定義するMessageSource
クラスの例を示します。
_import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.MessageSource;
import org.springframework.context.annotation.Bean;
import org.springframework.context.support.ReloadableResourceBundleMessageSource;
import org.springframework.validation.beanvalidation.LocalValidatorFactoryBean;
@SpringBootApplication
public class Application {
@Bean
public MessageSource messageSource() {
ReloadableResourceBundleMessageSource messageSource = new ReloadableResourceBundleMessageSource();
messageSource.setBasename("classpath:messages");
messageSource.setDefaultEncoding("UTF-8");
return messageSource;
}
@Bean
public LocalValidatorFactoryBean validator() {
LocalValidatorFactoryBean bean = new LocalValidatorFactoryBean();
bean.setValidationMessageSource(messageSource());
return bean;
}
public static void main(String[] args) {
SpringApplication.run(Application.class, args);
}
}
_
LocalValidatorFactoryBean
Beanを定義すると、次のようなカスタム検証メッセージを使用できます。
_@NotEmpty(message = "{validation.mail.notEmpty}")
@Email
private String email;
_
およびmessages.properties:
_validation.mail.notEmpty=E-mail cannot be empty!
_
およびThymeleafテンプレートファイル:
_<p th:if="${#fields.hasErrors('email')}" th:errors="*{email}">Name Error</p>
_
https://github.com/wololock/stackoverflow-answers/tree/master/45692179
問題を反映するサンプルのSpring Bootアプリケーションを用意しました。自由にクローンを作成してローカルで実行してください。フォームで投稿された値が_@NotEmpty
_および_@Email
_検証に適合しない場合、翻訳された検証メッセージを表示します。
WebMvcConfigurerAdapter
構成WebMvcConfigurerAdapter
を拡張する場合は、親クラスのgetValidator()
メソッドをオーバーライドしてバリデーターを提供する必要があります。例:
_import org.springframework.context.MessageSource;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.support.ReloadableResourceBundleMessageSource;
import org.springframework.validation.Validator;
import org.springframework.validation.beanvalidation.LocalValidatorFactoryBean;
import org.springframework.web.servlet.config.annotation.EnableWebMvc;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurerAdapter;
@Configuration
@EnableWebMvc
public class WebConfiguration extends WebMvcConfigurerAdapter {
@Bean
public MessageSource messageSource() {
ReloadableResourceBundleMessageSource messageSource = new ReloadableResourceBundleMessageSource();
messageSource.setBasename("classpath:messages");
messageSource.setDefaultEncoding("UTF-8");
return messageSource;
}
@Bean
@Override
public Validator getValidator() {
LocalValidatorFactoryBean bean = new LocalValidatorFactoryBean();
bean.setValidationMessageSource(messageSource());
return bean;
}
// other methods...
}
_
そうでない場合、他の場所でLocalValidatorFactoryBean
Beanを定義するとオーバーライドされ、効果はありません。
役に立てば幸いです。
使用しているスプリングブートのバージョンがわからない。 Spring boot _2.0.1.RELEASE
_を使用しています。より明確なソリューションは、すべての検証メッセージを_ValidationMessages.properties
_に移動することです。この方法では、自動構成されたValidator()
をオーバーライドしてMessageSource
を設定する必要はありません。
レストコントローラーの場合、メソッドパラメーターのリクエスト本文に@Validアノテーションを追加する必要があります。例えば
@PostMapping
public User create(@Valid @RequestBody User user){
//...
}