質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
CDN

CDNは、Webコンテンツをインターネット経由で配信するのに最適化されたネットワークを指します。Webサイトにある静的コンテンツをWebサイトが管理されているサーバーとは異なるサーバーにキャッシュし代わりに配信することで、負荷が分散し速度を向上する仕組みです。

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

Thymeleaf

Thymeleaf(タイムリーフ)とは、Java用のテンプレートエンジンで、特定のフレームワークに依存せず使用することが可能です。

Spring Boot

Spring Bootは、Javaのフレームワークの一つ。Springプロジェクトが提供する様々なフレームワークを統合した、アプリケーションを高速で開発するために設計されたフレームワークです。

Q&A

解決済

1回答

3062閲覧

Springboot+Thymeleafで、静的コンテンツのURLを環境毎に切替えたい

Matsukubo

総合スコア10

CDN

CDNは、Webコンテンツをインターネット経由で配信するのに最適化されたネットワークを指します。Webサイトにある静的コンテンツをWebサイトが管理されているサーバーとは異なるサーバーにキャッシュし代わりに配信することで、負荷が分散し速度を向上する仕組みです。

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

Thymeleaf

Thymeleaf(タイムリーフ)とは、Java用のテンプレートエンジンで、特定のフレームワークに依存せず使用することが可能です。

Spring Boot

Spring Bootは、Javaのフレームワークの一つ。Springプロジェクトが提供する様々なフレームワークを統合した、アプリケーションを高速で開発するために設計されたフレームワークです。

1グッド

1クリップ

投稿2020/10/19 13:59

前提・実現したいこと

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系です

A-pZ👍を押しています

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

ThymeleafからSpringのBean(今回の実装では @Component)を参照する方法は、@Bean名 です。

html

1th:src="@{${@testAppProperties.buildUrl('/images/logo_on.png')}}"

https://www.thymeleaf.org/doc/articles/springmvcaccessdata.html の 5. Spring beans を参照ください

※URLを記述する????と、Bean参照する????が続くように見えますが、これが正しいです…。

~~TestAppPropertiesで参照しているymlの変数名と、対象プロパティクラスがもつフィールド名の大文字小文字が一致していないためです。
~~

投稿2020/10/19 14:20

編集2020/10/20 00:35
A-pZ

総合スコア12011

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Matsukubo

2020/10/19 14:23

申し訳有りません、記載ミスでした。実際のソースはymlのフィールドと変数名の大文字小文字は一致させています。
A-pZ

2020/10/20 00:27

おっと了解です。Controller内では取得できていたけれど、Thymeleaf内で表示できない感じですね?お待ちください。
Matsukubo

2020/10/20 09:35

ありがとうございます!Bean参照のところ、勉強不足でした。ご教示いただいた内容で修正した結果、想定どおりURLの切替ができるようになりました!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問