thymeleaf電子メールテンプレートからのアプリケーションコンテキストBeanへのアクセス

xtian

このThymeleafチュートリアル「Thymeleafを使用したSpringのリッチHTMLメール」に従って、Thymeleafテンプレートを使用してメールを生成しました。すべて問題ありませんが、アプリケーションの他の場所で使用しているApplicationContextBeanにアクセスできません。

具体的には、メールテンプレートに次のようなものを入れたいと思います。

<span th:text="${@myBean.doSomething()}">

ここで、「myBean」は@Componentです。それは可能ですか?私は次のような回避策を探していません

<span th:text="${myBean.doSomething()}">

ここで、Beanはテンプレート処理コンテキストで変数として追加されます。

構成:

@Configuration
@EnableWebMvc
@EnableSpringDataWebSupport
public class MyWebConfig extends WebMvcConfigurerAdapter {
[....]
public ClassLoaderTemplateResolver emailTemplateResolver() {
    ClassLoaderTemplateResolver resolver = new ClassLoaderTemplateResolver();
    resolver.setPrefix("emailtemplates/");
    resolver.setSuffix(".html");
    resolver.setCharacterEncoding("UTF-8");
    resolver.setTemplateMode("HTML5");
    return resolver;
}

@Bean
public SpringTemplateEngine emailTemplateEngine() {
    SpringTemplateEngine engine = new SpringTemplateEngine();
    engine.addTemplateResolver(emailTemplateResolver());
    engine.addDialect(new LayoutDialect()); // thymeleaf-layout-dialect
    addSpringSecurityDialect(engine); // thymeleaf-SpringSecurity-dialect
    return engine;
}
[....]
}

メールサービス:

@Service
public class MyEmailService {
@Resource SpringTemplateEngine emailTemplateEngine;
[....]
public boolean sendHtmlEmail(...) {
    final Context ctx = new Context(locale);
    ctx.setVariable("someVariable", "someValue"); // Don't want to add myBean here
    final String body = this.emailTemplateEngine.process("myTemplate", ctx);
    [....]

コンポーネント:

@Component
public class MyBean {
    public String doSomething() {
        return "Something done!";
    }
}

テンプレート:

<span th:text="${@myBean.doSomething()}">

エラー:

EL1057E:(pos 1):Bean'myBean 'へのアクセスを解決するためのBeanリゾルバーがコンテキストに登録されていません

thymeleaf-2.1.4とspring-4.1.6を使用しています

編集:

リクエストを確実に使用できない@Asyncメソッドでほとんどのメールを送信するため、HttpServletRequestを使用できないことに注意してください。これが、WebContextではなくContextを使用する理由です(SpringWebContextについては知りませんでしたが、誰かが「beans」変数を介してBeanにアクセスするためにそのクラスを作成した場合、@ myBean表記を使用することは不可能であるに違いありません)。

ダリオ・サイドル

ここには3つの異なるコンテキストがあるため、混乱します。

  • スケジュールされた方法でメールを送信している場合ApplicationContextSpringはではありませんWebApplicationContext
  • org.thymeleaf.context.Context変数を設定/追加するThymeleaf
  • org.springframework.expression.EvaluationContextSpEL式を評価するために使用されるSpEL評価コンテキストThymeleafの場合はそれThymeleafEvaluationContextです。

Spring Webコンテキストがない場合、必要なのはThymeleafEvaluationContext、アプリケーションコンテキストへの参照を変数としてThymeleafに追加することだけContextです。

例(Kotlin)

@Service
class TemplateService(
        private val templateEngine: TemplateEngine,
        private val applicationContext: ApplicationContext
) {

    fun processTemplate(locale: Locale, template: String, vararg variables: Pair<String, Any?>): String {
        val context = Context(locale)

        // Set the Thymeleaf evaluation context to allow access to Spring beans with @beanName in SpEL expressions
        context.setVariable(ThymeleafEvaluationContext.THYMELEAF_EVALUATION_CONTEXT_CONTEXT_VARIABLE_NAME,
                ThymeleafEvaluationContext(applicationContext, null))

        // Set additional variables
        variables.forEach { (key, value) -> context.setVariable(key, value) }

        return templateEngine.process(template, context)
    }
}

この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。

侵害の場合は、連絡してください[email protected]

編集
0

コメントを追加

0

関連記事

分類Dev

EJB 3:アプリケーションクライアントからステートフルセッションBeanへのアクセス

分類Dev

Thymeleafテンプレートのセッション属性へのアクセス

分類Dev

春のセキュリティコンテキストからアプリケーションコンテキストにアクセスする

分類Dev

アプリケーションコンテキストからのSpringBeanの削除

分類Dev

非アクティビティ/アプリケーションコンテキストからのconfirmDeveiceCredentialIntent

分類Dev

別のWebアプリケーションテキストボックスへのコンソールアプリケーション文字列出力

分類Dev

SpringBootApplicationTestのアプリケーションコンテキストからEurekaClient Beanを除外する

分類Dev

Springアプリケーションコンテキストへの事前構築済みBeanの追加

分類Dev

ホストからコンテナのWebアプリケーションにアクセスする方法

分類Dev

Androidのアプリケーションコンテキスト

分類Dev

WindowsのコンテキストメニューからJavaアプリケーションを実行する

分類Dev

アプリケーションがステートレスの場合のセッションBean

分類Dev

Spring FrameworkのアプリケーションコンテキストとBeanファクトリとは

分類Dev

別のプロジェクトからのスプリングインポートアプリケーションコンテキスト

分類Dev

ルート53:EC2 +アプリケーションコンテキストへのリダイレクト

分類Dev

Springアプリケーションコンテキストからのサーブレットコンテキスト属性

分類Dev

Androidのストレージクラスのアプリケーションコンテキストにアクセスする

分類Dev

SpringBootアプリケーションのコンテキストでBeanが見つかりません

分類Dev

Handlebar.jsテンプレートのルートコンテキストへのアクセス

分類Dev

流星レンダリングテンプレートの特定のIDからコレクションフィールドにアクセスする

分類Dev

小枝テンプレートのリンク #options キーへのアクセス

分類Dev

JUnitは、正しいアプリケーションコンテキストをロードしているにもかかわらず、間違ったデータベースへのアクセスをテストします

分類Dev

非アクティビティクラスのアプリケーションコンテキスト?

分類Dev

プレーンテキストの電子メール用にLotusNotesクライアントを修正する方法

分類Dev

Spring:「ルート」アプリケーションコンテキストと「サーブレット」アプリケーションコンテキストが異なるパーティによって作成されるのはなぜですか?

分類Dev

アプリケーションコンテキスト内のBeanのいくつかの依存関係がサイクルを形成します

分類Dev

アプリケーションとリクエストのコンテキストは何ですか?

分類Dev

非アクティビティシングルトンクラスからアプリケーションコンテキストを取得する

分類Dev

Restアプリケーションのユーザーコンテキスト

Related 関連記事

  1. 1

    EJB 3:アプリケーションクライアントからステートフルセッションBeanへのアクセス

  2. 2

    Thymeleafテンプレートのセッション属性へのアクセス

  3. 3

    春のセキュリティコンテキストからアプリケーションコンテキストにアクセスする

  4. 4

    アプリケーションコンテキストからのSpringBeanの削除

  5. 5

    非アクティビティ/アプリケーションコンテキストからのconfirmDeveiceCredentialIntent

  6. 6

    別のWebアプリケーションテキストボックスへのコンソールアプリケーション文字列出力

  7. 7

    SpringBootApplicationTestのアプリケーションコンテキストからEurekaClient Beanを除外する

  8. 8

    Springアプリケーションコンテキストへの事前構築済みBeanの追加

  9. 9

    ホストからコンテナのWebアプリケーションにアクセスする方法

  10. 10

    Androidのアプリケーションコンテキスト

  11. 11

    WindowsのコンテキストメニューからJavaアプリケーションを実行する

  12. 12

    アプリケーションがステートレスの場合のセッションBean

  13. 13

    Spring FrameworkのアプリケーションコンテキストとBeanファクトリとは

  14. 14

    別のプロジェクトからのスプリングインポートアプリケーションコンテキスト

  15. 15

    ルート53:EC2 +アプリケーションコンテキストへのリダイレクト

  16. 16

    Springアプリケーションコンテキストからのサーブレットコンテキスト属性

  17. 17

    Androidのストレージクラスのアプリケーションコンテキストにアクセスする

  18. 18

    SpringBootアプリケーションのコンテキストでBeanが見つかりません

  19. 19

    Handlebar.jsテンプレートのルートコンテキストへのアクセス

  20. 20

    流星レンダリングテンプレートの特定のIDからコレクションフィールドにアクセスする

  21. 21

    小枝テンプレートのリンク #options キーへのアクセス

  22. 22

    JUnitは、正しいアプリケーションコンテキストをロードしているにもかかわらず、間違ったデータベースへのアクセスをテストします

  23. 23

    非アクティビティクラスのアプリケーションコンテキスト?

  24. 24

    プレーンテキストの電子メール用にLotusNotesクライアントを修正する方法

  25. 25

    Spring:「ルート」アプリケーションコンテキストと「サーブレット」アプリケーションコンテキストが異なるパーティによって作成されるのはなぜですか?

  26. 26

    アプリケーションコンテキスト内のBeanのいくつかの依存関係がサイクルを形成します

  27. 27

    アプリケーションとリクエストのコンテキストは何ですか?

  28. 28

    非アクティビティシングルトンクラスからアプリケーションコンテキストを取得する

  29. 29

    Restアプリケーションのユーザーコンテキスト

ホットタグ

アーカイブ