

マルチモジュール構成のSpringBootプロジェクトで  
SpringSecurityを使用したログイン画面を作成中です。

ドメイン層側でUsernameNotFoundExceptionが発生した際に  
ドメイン層側に置いた  
/resources/i18n/messages_ja.propertiesからメッセージを取得したいのですが

No message found under code 'test.error' for locale 'ja_JP'.  
が表示され取得できません

■判定処理部分

[code]

    @Service
    public class UserDetailsServiceImpl implements UserDetailsService {
    
        @Autowired
        MessageSourceImpl message;
    
        @Override
        public UserDetails loadUserByUsername(String email) throws UsernameNotFoundException {
    
            if (!email.equals("aaaa")) {
                throw new UsernameNotFoundException(message.getMessage("test.error"));
            }
    
            return null;
        }
    
    }
    
[/code]

/resources配下に置いたmessages.propertiesに記載した際は正しく取得されるので  
設定周りだとは思いますが１週間以上試行錯誤してもさっぱりうまくいきません。  
どうか手助け頂けると幸いです。本当にどうか宜しくお願い致します。

■ソース全量  
<https://github.com/hi-soft68/hisohi>

初めての投稿で不足がありましたら申し訳ありません。


CC BY-SA 3.0
2017-11-12T01:23:22.300
39509
2020-03-29T11:01:20.273
26155
question
java spring-boot
SpringBoot+マルチモジュール構成でプロパティファイルからメッセージが取得できない


ぱっと見での回答ですが(誤っていたら、すいません)。

`application.yml`は、`hisohi/test-domain/src/main/resources/`には無くてもいいでしょうか？

`application.yml`が無いので、以下の定義が効かなくて日本語メッセージが取得できないのでは、と思いました。

[code]

    spring:
      messages:
        basename: i18n/messages
    
[/code]


CC BY-SA 3.0
2017-11-13T03:16:29.837
39534
2017-11-13T03:22:20.930
2017-11-13T03:22:20.930
21092
21092
39509
answer


[`--debug` オプション](https://docs.spring.io/spring-
boot/docs/current/reference/html/boot-features-logging.html#boot-features-
logging-console-output) をつければauto-configure設定などが出力されるので状況が把握しやすくなります。

今回の場合、

  * `MessageSource`コンポーネント([`MessageSourceImpl`](https://github.com/hi-soft68/hisohi/blob/master/test-domain/src/main/java/com/example/test/domain/service/MessageSourceImpl.java))を自前で実装したため、 [`MessageSourceAutoConfiguration`は適用されません](https://github.com/spring-projects/spring-boot/blob/v2.0.0.RELEASE/spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/context/MessageSourceAutoConfiguration.java#L52)
  * (そもそも[自身で `new` している](https://github.com/hi-soft68/hisohi/blob/master/test-domain/src/main/java/com/example/test/domain/service/MessageSourceImpl.java#L14)のでDIは機能しない)

* * *

自前で [`MessageSource`を構築する](https://github.com/spring-projects/spring-
boot/blob/v2.0.0.RELEASE/spring-boot-project/spring-boot-
autoconfigure/src/main/java/org/springframework/boot/autoconfigure/context/MessageSourceAutoConfiguration.java#L66-L85)必要があります。

[code]

    diff --git a/test-domain/src/main/java/com/example/test/domain/service/MessageSourceImpl.java b/test-domain/src/main/java/com/example/test/domain/service/MessageSourceImpl.java
    index 35113d6..5f46f48 100644
    --- a/test-domain/src/main/java/com/example/test/domain/service/MessageSourceImpl.java
    +++ b/test-domain/src/main/java/com/example/test/domain/service/MessageSourceImpl.java
    @@ -2,16 +2,28 @@ package com.example.test.domain.service;
    
     import java.util.Locale;
    
    +import javax.annotation.PostConstruct;
    +
    +import org.springframework.beans.factory.annotation.Autowired;
     import org.springframework.boot.autoconfigure.context.MessageSourceAutoConfiguration;
    +import org.springframework.boot.autoconfigure.context.MessageSourceProperties;
     import org.springframework.context.MessageSource;
     import org.springframework.context.MessageSourceResolvable;
     import org.springframework.context.NoSuchMessageException;
    +import org.springframework.context.support.ResourceBundleMessageSource;
     import org.springframework.stereotype.Component;
    
     @Component
     public class MessageSourceImpl implements MessageSource {
    
    -    private MessageSource message = new MessageSourceAutoConfiguration().messageSource();
    +    private MessageSource message;
    +
    +    @PostConstruct
    +    public void init() {
    +        ResourceBundleMessageSource messageSource = new ResourceBundleMessageSource();
    +        messageSource.setBasename("i18n/messages");
    +        message = messageSource;
    +    }
    
         public String getMessage(String code) {
             return message.getMessage(code, null, Locale.getDefault());
    
[/code]

`"i18n/messages"` の部分を設定ファイルから読み取りたいのであれば、
[`MessageSourceProperties`相当の実装](https://github.com/spring-projects/spring-
boot/blob/v2.0.0.RELEASE/spring-boot-project/spring-boot-
autoconfigure/src/main/java/org/springframework/boot/autoconfigure/context/MessageSourceAutoConfiguration.java#L60-L64)も自前で行うことになります。

* * *

なお、最新版ではこの辺りの実装が変わっているようですので、挙動も異なるかもしれません。


CC BY-SA 4.0
2019-05-07T10:44:51.170
54799
2019-05-07T10:53:16.850
2019-05-07T10:53:16.850
2808
2808
39509
answer