복붙노트

[SPRING] 스프링 부트 - 여러 템플릿 위치

SPRING

스프링 부트 - 여러 템플릿 위치

나는 Spring이 src / main / resource / templates /뿐만 아니라 다른 위치에있는 템플릿을 찾길 원한다.

여기 내가 가지고있는 것

@Configuration
public class WebConfig{

    @Autowired
    private SpringTemplateEngine templateEngine;

    @PostConstruct
    public void clientTemplate(){
        SpringResourceTemplateResolver resolver = new SpringResourceTemplateResolver();
        resolver.setPrefix("static/client");
        resolver.setSuffix(".html");
        resolver.setTemplateMode("HTML5");
        resolver.setOrder(templateEngine.getTemplateResolvers().size());
        resolver.setCacheable(false);
        templateEngine.addTemplateResolver(resolver);
    }
}

하지만 기존의 템플릿 index.html / src / main / resources / static / client에 접근하려고하면 다음과 같은 결과가 나옵니다.

java.lang.IllegalArgumentException: ApplicationContext has not been initialized in resource resolver. TemplateResolver or ResourceResolver might not have been correctly configured by the Spring Application Context.
at org.thymeleaf.util.Validate.notNull(Validate.java:37)
at org.thymeleaf.spring4.resourceresolver.SpringResourceResourceResolver.getResourceAsStream(SpringResourceResourceResolver.java:81)
at org.thymeleaf.TemplateRepository.getTemplate(TemplateRepository.java:221)
at org.thymeleaf.TemplateEngine.process(TemplateEngine.java:1104)
at org.thymeleaf.TemplateEngine.process(TemplateEngine.java:1060)
at org.thymeleaf.TemplateEngine.process(TemplateEngine.java:1011)
at org.thymeleaf.spring4.view.ThymeleafView.renderFragment(ThymeleafView.java:335)
at org.thymeleaf.spring4.view.ThymeleafView.render(ThymeleafView.java:190)
at org.springframework.web.servlet.DispatcherServlet.render(DispatcherServlet.java:1257)
at org.springframework.web.servlet.DispatcherServlet.processDispatchResult(DispatcherServlet.java:1037)
at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:980)
at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:897)
at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:970)
at org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:861)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:622)
at org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:846)

이 문제를 해결하는 방법?

해결법

  1. ==============================

    1.현재 설정을 사용하면 @Bean 메서드가 아닌 SpringResourceTemplateResolver의 인스턴스를 생성하게됩니다. 따라서 Spring에 의해 선택되지 않고 ApplicationContext (예)를 제공해야합니다.

    현재 설정을 사용하면 @Bean 메서드가 아닌 SpringResourceTemplateResolver의 인스턴스를 생성하게됩니다. 따라서 Spring에 의해 선택되지 않고 ApplicationContext (예)를 제공해야합니다.

    SpringResourceTemplateResolver resolver = new SpringResourceTemplateResolver();
    resolver.setApplicationContext(applicationContext);
    resolver.setPrefix("/WEB-INF/templates/");
    resolver.setTemplateMode(TemplateMode.HTML);
    

    resolver.setApplicationContext (applicationContext)를 주목하십시오;

    아마도 그렇게 할 필요가없는 예제를 보았을 것이지만, @Bean 메소드에서 SpringResourceTemplateResolver 인스턴스를 만드는 것이 가장 확실합니다. Spring은 그것을 선택하고 애플리케이션 컨텍스트를 설정한다 (예제) :

    @Bean
    public ITemplateResolver templateResolver() {
        SpringResourceTemplateResolver resolver = new SpringResourceTemplateResolver();
        resolver.setPrefix("/WEB-INF/templates/");
        resolver.setSuffix(".html");
        resolver.setTemplateMode(TemplateMode.HTML);
        resolver.setCacheable(false);
        return resolver;
    }
    
  2. ==============================

    2.ThymeLeaf는 템플릿 분석기가 @Bean으로 정의되지 않은 경우 이동합니다. WebConfig 클래스를이 클래스로 바꿀 수 있습니다.

    ThymeLeaf는 템플릿 분석기가 @Bean으로 정의되지 않은 경우 이동합니다. WebConfig 클래스를이 클래스로 바꿀 수 있습니다.

    @Configuration
    public class WebConfig{
        @Bean
        public ITemplateResolver templateResolver() {
            SpringResourceTemplateResolver resolver = new SpringResourceTemplateResolver();
            resolver.setPrefix("static/client");
            // For Spring Boot
            // resolver.setPrefix("classpath:/templates/");
            resolver.setSuffix(".html");
            resolver.setTemplateMode("HTML5");
            resolver.setCacheable(false);
            return resolver;
        } 
    }
    

    새 템플릿이 선택되어 템플릿 확인자 목록에 추가되어 "templateEngine.addTemplateResolver ()"와 동일한 작업이 수행됩니다.

  3. from https://stackoverflow.com/questions/39414055/spring-boot-multiple-template-location by cc-by-sa and MIT license