Nano Hash - криптовалюты, майнинг, программирование

Компонент Thymeleaf Template Engine Bean игнорируется

У меня есть приложение Spring, но моя конфигурация для Thymeleaf полностью игнорируется. Что я делаю не так? Мне нужен Thymeleaf для обработки внешних файлов Javascript, но без работающей конфигурации я не могу добавить преобразователь шаблонов Javascript.

Я знаю, что это не работает, потому что Thymeleaf говорит мне, что режим HTML5 устарел, но, как вы можете видеть, я установил режим HTML.

package de.xy;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.autoconfigure.domain.EntityScan;
import org.springframework.boot.builder.SpringApplicationBuilder;
import org.springframework.boot.web.support.SpringBootServletInitializer;
import org.springframework.scheduling.annotation.EnableScheduling;

@SpringBootApplication
@EnableScheduling
@EntityScan("de.xy.model")
public class Application extends SpringBootServletInitializer {

    public static void main(String[] args) {
        SpringApplication.run(Application.class, args);
    }

    @Override
    protected SpringApplicationBuilder configure(SpringApplicationBuilder application) {
        return application.sources(Application.class);
    }
}

Конфигурация

package de.xy.config;

import org.springframework.context.ApplicationContext;
import org.springframework.context.ApplicationContextAware;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.ViewResolver;
import org.springframework.web.servlet.config.annotation.EnableWebMvc;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurerAdapter;
import org.thymeleaf.TemplateEngine;
import org.thymeleaf.extras.springsecurity4.dialect.SpringSecurityDialect;
import org.thymeleaf.spring4.SpringTemplateEngine;
import org.thymeleaf.spring4.templateresolver.SpringResourceTemplateResolver;
import org.thymeleaf.spring4.view.ThymeleafViewResolver;
import org.thymeleaf.templatemode.TemplateMode;
import org.thymeleaf.templateresolver.ITemplateResolver;

@Configuration
@EnableWebMvc
@ComponentScan("de.xy")
public class ThymeleafConfig extends WebMvcConfigurerAdapter implements ApplicationContextAware {

    private ApplicationContext applicationContext;

    public void setApplicationContext(ApplicationContext applicationContext) {
        this.applicationContext = applicationContext;
    }

    @Bean
    public ViewResolver viewResolver() {
        ThymeleafViewResolver resolver = new ThymeleafViewResolver();
        resolver.setTemplateEngine(templateEngine());
        resolver.setCharacterEncoding("UTF-8");
        return resolver;
    }

    @Bean
    public TemplateEngine templateEngine() {
        SpringTemplateEngine engine = new SpringTemplateEngine();
        engine.setEnableSpringELCompiler(true);
        engine.setTemplateResolver(templateResolver());
        engine.addDialect(new SpringSecurityDialect());
        return engine;
    }

    private ITemplateResolver templateResolver() {
        SpringResourceTemplateResolver resolver = new SpringResourceTemplateResolver();
        resolver.setApplicationContext(applicationContext);
        resolver.setPrefix("/WEB-INF/templates/");
        resolver.setTemplateMode(TemplateMode.HTML);
        return resolver;
    }
}

РЕДАКТИРОВАТЬ:
Рабочая конфигурация:

@Configuration
public class ThymeleafConfig extends WebMvcConfigurerAdapter implements ApplicationContextAware {

    private static final String UTF8    = "UTF-8";

    private ApplicationContext  applicationContext;

    @Override
    public void setApplicationContext(ApplicationContext applicationContext) {
        this.applicationContext = applicationContext;
    }

    @Bean
    public ViewResolver htmlViewResolver() {
        ThymeleafViewResolver resolver = new ThymeleafViewResolver();
        resolver.setTemplateEngine(templateEngine(htmlTemplateResolver()));
        resolver.setContentType("text/html");
        resolver.setCharacterEncoding(UTF8);
        resolver.setViewNames(new String[] { "*.html" });
        return resolver;
    }

    @Bean
    public ViewResolver cssViewResolver() {
        ThymeleafViewResolver resolver = new ThymeleafViewResolver();
        resolver.setTemplateEngine(templateEngine(cssTemplateResolver()));
        resolver.setContentType("text/css");
        resolver.setCharacterEncoding(UTF8);
        resolver.setViewNames(new String[] { "*.css" });
        return resolver;
    }

    @Bean
    public ViewResolver javascriptViewResolver() {
        ThymeleafViewResolver resolver = new ThymeleafViewResolver();
        resolver.setTemplateEngine(templateEngine(javascriptTemplateResolver()));
        resolver.setContentType("application/javascript");
        resolver.setCharacterEncoding(UTF8);
        resolver.setViewNames(new String[] { "*.js" });
        return resolver;
    }

    private TemplateEngine templateEngine(ITemplateResolver templateResolver) {
        SpringTemplateEngine engine = new SpringTemplateEngine();
        engine.setTemplateResolver(templateResolver);
        return engine;
    }

    private ITemplateResolver htmlTemplateResolver() {
        SpringResourceTemplateResolver resolver = new SpringResourceTemplateResolver();
        resolver.setApplicationContext(applicationContext);
        resolver.setPrefix("/WEB-INF/templates/");
        resolver.setTemplateMode(TemplateMode.HTML);
        return resolver;
    }

    private ITemplateResolver cssTemplateResolver() {
        SpringResourceTemplateResolver resolver = new SpringResourceTemplateResolver();
        resolver.setApplicationContext(applicationContext);
        resolver.setPrefix("/WEB-INF/css/");
        resolver.setTemplateMode(TemplateMode.CSS);
        return resolver;
    }

    private ITemplateResolver javascriptTemplateResolver() {
        SpringResourceTemplateResolver resolver = new SpringResourceTemplateResolver();
        resolver.setApplicationContext(applicationContext);
        resolver.setPrefix("/WEB-INF/js/");
        resolver.setTemplateMode(TemplateMode.JAVASCRIPT);
        return resolver;
    }
}

JavascriptКонтроллер:

@Controller
@RequestMapping("js")
public class JavascriptController {

    @RequestMapping("somejavascriptfile.js")
    public String getJS() {
        return "somejavascriptfile.js";
    }}

Это больше, чем мне нужно, но это работает (Контроллер ничего не делает)

15.11.2017

  • У меня есть различные другие классы конфигурации в пакете de.xy.config, которые отлично работают (например, компоненты источника данных). 15.11.2017
  • Почему вы не следуете стандартной организации проекта весенней загрузки, то есть помещаете весь статический контент в папку ресурсов, даже файлы тимелеафа? И если эта зависимость spring-boot-starter-thymeleaf находится в вашем пути к классам, Spring boot самостоятельно настроит преобразователь представления на использование тимелеафа. 15.11.2017
  • Я думал, что следую стандартной организации проекта весенней загрузки... у меня есть файлы html в src/main/resources/templates, а все файлы js и css в src/main/webapp. 15.11.2017
  • В стандартной организации Spring Boot все файлы js, css и изображений должны находиться в /resources/static. Вы можете переопределить это, если хотите, но предпочтительнее следовать стандартизации. 16.11.2017
  • Итак, если теперь у меня есть файлы js и css в /resources/static/js и /resources/static/css, как разрешить их запрос? До сих пор я использовал resourceHandlerRegistry.addResourceHandler(/js/**).addResourceLocations(/js/). Нужен ли мне контроллер с отображением запросов для каждого статического файла? 16.11.2017
  • Хорошо, я удалил все свои классы конфигурации (особенно WebMvcConfigurerAdapter, который выполнял обработчики ресурсов), и теперь мои статические ресурсы доступны через /js/somefile.js. Но у меня все еще есть проблема, что мне нужны файлы JS для обработки Thymeleaf. 16.11.2017

Ответы:


1

Я обычно регистрирую свое статическое содержимое следующим образом:

@Override
protected void addResourceHandlers( ResourceHandlerRegistry registry ) {
    registry.addResourceHandler( "/js/**", "/css/**", "/images/**" ).addResourceLocations( "classpath:static/js/", "classpath:static/css/", "classpath:static/images/" );
}

Вам не нужно снова определять новый контроллер.

ИЗМЕНИТЬ

И в Thymeleaf пример включения файлов css:

<link rel="stylesheet" th:href="@{css/styles.css}" />
15.11.2017
  • И как обработать эти файлы Thymeleaf? 16.11.2017
  • Смотрите редактирование, это для css, но для js-файлов должно быть то же самое. 16.11.2017
  • Мне нужны такие вещи внутри моих файлов js: var somePath= /* [[@{/js/file.js}]] *//js/file.js; 16.11.2017
  • Вы хотите получить путь к вашему статическому контенту в своем скрипте? Поскольку это static, я предполагаю, что они не будут меняться, поэтому вы можете добавить их вручную. 16.11.2017
  • на сервере он меняется... например: example.com/myapp/js/file.js или example.com/application/js/file.js. И на будущее было бы неплохо узнать, как добавить атрибуты модели в файлы javascript. 16.11.2017
  • Переменная часть - это example.com/myapp/, а не конечная часть, поэтому вы можете получить ее динамически, которая зависит от объекта location javascript, и составить свой URL-адрес. 16.11.2017
  • Я переместил свои динамические файлы JS в WEB-INF/js и добавил контроллер для этих файлов + новый bean-компонент Thymeleaf TemplateEngine для обработки этих файлов. Кажется, это работает. Мне все равно нужен Thymeleaf в некоторых файлах Javascript, поэтому [[@{...}]] проще, чем составить мой URL-адрес с местоположением javascripts. 16.11.2017
  • Не могли бы вы опубликовать код вашего решения. Это важно для других пользователей. 17.11.2017
  • Новые материалы

    Кластеризация: более глубокий взгляд
    Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

    Как написать эффективное резюме
    Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

    Частный метод Python: улучшение инкапсуляции и безопасности
    Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

    Как я автоматизирую тестирование с помощью Jest
    Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

    Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
    Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

    Понимание расстояния Вассерштейна: мощная метрика в машинном обучении
    В обширной области машинного обучения часто возникает необходимость сравнивать и измерять различия между распределениями вероятностей. Традиционные метрики расстояния, такие как евклидово..

    Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
    В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..