반응형

일단 Spring Boot App을 Tomcat에 올려서 사용하는 분들은 잘 될것이므로, 뒤로 가기를 눌러주시길..


Embedded Server로 띄우는 경우, 아래와 같은 구문을 freemarker상단에 넣어서 taglib을 가져오겠다고하면,

url이 정확한데도 불구하고, 찾을 수 없다고 나온다.


<#assign security=JspTaglibs["http://www.springframework.org/security/tags"] >



이런 경우 기본적으로 아래와 같은 두 가지의 라이브러리를 필요로 한다.


<dependency>
      <groupId>javax.servlet</groupId>
      <artifactId>jstl</artifactId>
      <scope>provided</scope>
</dependency>
<dependency>
      <groupId>org.apache.tomcat.embed</groupId>
      <artifactId>tomcat-embed-jasper</artifactId>
</dependency>



이렇게 추가를 하고, 돌려보면 jsp만 사용하는 환경에서는 잘 돌아갈 것이다.


하지만, Boot 환경에서의 Freemarker는 Spring Security의 TagLib에 대한 고려가 되어 있지 않기 때문에,

이미 설정된 부분을 불러와서 Tld를 로딩할 수 있도록 수동처리해주어야 한다.


아래와 같은 클래스를 만들어서 기존 Freemarker 설정(FreeMarkerConfigurer)을 불러와서, Tld를 직접 인식하도록 해준다.


import java.util.Arrays;
import java.util.List;

import javax.annotation.PostConstruct;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.servlet.view.freemarker.FreeMarkerConfigurer;

public class ClassPathTldsLoader  {
    
    private static final String SECURITY_TLD = "/META-INF/security.tld";
    
    final private List<String> classPathTlds;

    public ClassPathTldsLoader(String... classPathTlds) {
        super();
        if(classPathTlds.length == 0){
            this.classPathTlds = Arrays.asList(SECURITY_TLD);
        }else{
            this.classPathTlds = Arrays.asList(classPathTlds);
        }
    }

    @Autowired
    private FreeMarkerConfigurer freeMarkerConfigurer;
    
    @PostConstruct
    public void loadClassPathTlds() {
        freeMarkerConfigurer.getTaglibFactory().setClasspathTlds(classPathTlds);
    }
}


 


그 후, 아래와 같이 Bean으로 등록해주면 해결이 된다.


@Bean
@ConditionalOnMissingBean(ClassPathTldsLoader.class)
public ClassPathTldsLoader classPathTldsLoader(){
    return new ClassPathTldsLoader();
}


Spring Issue Tracker에는 2014년부터 문제가 되고 있던 사항(https://github.com/spring-projects/spring-boot/issues/907)

인데, 공식적으로 해결을 안해준다. ㅠㅠ

반응형
,