web-dev-qa-db-ja.com

Spring Boot検証メッセージは解決されていません

検証メッセージの解決に問題があります。

私はウェブを検索して読んでおり、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) {にぶつかります

だから...私のメッセージ形式は正しくありません。これは私の範囲/知識から外れています。誰がそれが意味することを知っていますか?

16
Korashen

アプリケーション構成に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を定義するとオーバーライドされ、効果はありません。

役に立てば幸いです。

41
Szymon Stepniak

使用しているスプリングブートのバージョンがわからない。 Spring boot _2.0.1.RELEASE_を使用しています。より明確なソリューションは、すべての検証メッセージを_ValidationMessages.properties_に移動することです。この方法では、自動構成されたValidator()をオーバーライドしてMessageSourceを設定する必要はありません。

15
want2learn

レストコントローラーの場合、メソッドパラメーターのリクエスト本文に@Validアノテーションを追加する必要があります。例えば

@PostMapping
public User create(@Valid @RequestBody User user){
  //...
}
1
A.Mushate