前提・実現したいこと
Spring Boot + Thymeleafでwebアプリケーション開発をしています。
ページ内の静的コンテンツ(image,css,javascript)について、AWSのCloudFrontを利用したCDN化を行いました。
CDNのURLは環境毎にドメインを分けていますので、以下のように静的コンテンツのURLを切替えたいと考えています。
・application.ymlを環境毎に用意する。
・各application.ymlに環境毎のURLを記載。
(例) cdnurl: http://example.com
・jarに内包されている静的コンテンツも利用できるように、ローカルのパスも用意する。
(例) localurl: http://localhost:8080/testApp/static
・application.yml内でCDN利用可否を制御するフラグを容易
(例) iscdn : true or false
発生している問題・エラーメッセージ
以下に記載しているように実装しましたが、yamlの値がセットされておらず(コンソールで確認するとnullになってしまっている)、
URLが「/testApp/null/images/logo_on.png」のようになり、画像が表示されません。
また、TestAppPropertiesをTestExpressionObjectFactoryでAutowiredしてみたところ、「null context object」となりました。
そもそもの実装方針として正しいのかも含めて、解決策をご教示いただけますでしょうか。
試したこと
①ymlの値をセットするクラスを用意
java
1@Data 2@Component 3@ConfigurationProperties(prefix = "static-contents") 4public class TestAppProperties { 5 6 private boolean iscdn; 7 private String cdnurl; 8 private String localurl; 9 10 public String buildUrl(String path) { 11 if(isCdn) { 12 return cdnUrl + path; 13 } else { 14 return localUrl + path; 15 } 16 } 17}
②IExpressionObjectFactory
Java
1public class TestExpressionObjectFactory implements IExpressionObjectFactory { 2 3 private static final String testAppPropertiesName = "testAppProperties"; 4 5 @Override 6 public Set<String> getAllExpressionObjectNames() { 7 8 Set<String> nameSet = new HashSet<String>(); 9 nameSet.add(testAppPropertiesName ); 10 return nameSet; 11 } 12 13 @Override 14 public Object buildObject(IExpressionContext context, String expressionObjectName) { 15 16 if(Objects.equals(testAppPropertiesName , expressionObjectName)) { 17 return new TestAppProperties (); 18 } 19 20 return null; 21 } 22 23 @Override 24 public boolean isCacheable(String expressionObjectName) { 25 26 return true; 27 } 28 29}
③Dialctクラスの用意
Java
1public class TestDialect extends AbstractDialect implements IExpressionObjectDialect { 2 3 protected TestDialect() { 4 super("testAppProperties"); 5 } 6 7 @Override 8 public IExpressionObjectFactory getExpressionObjectFactory() { 9 10 return new TestExpressionObjectFactory(); 11 } 12 13}
④Configrationクラス
Java
1@EnableWebMvc 2@Configuration 3public class TestConfigration implements WebMvcConfigurer { 4 @Bean 5 public RemitMailDialect RemitMailDialect() { 6 return new RemitMailDialect(); 7 } 8・・・
application.ymlは以下のように記述しています。
yaml
1static-contents: 2 isCdn: true 3 cdnUrl: http://xxxxxxxxxx.cloudfront.net 4 localUrl: http://localhost:8080/testApp/static
htmlに抜粋です。
html
1 <img alt="テストサイトロゴ" th:src="@{${#testAppProperties.buildUrl('/images/logo_on.png')}}" >
補足情報(FW/ツールのバージョンなど)
Spring Bootのバージョンは2.2.1、thymeleafは3系です
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2020/10/19 14:23
2020/10/20 00:27
2020/10/20 09:35