Spring Boot + Thymeleaf로 SpringTemplateEngine 사용자 정의

10315 단어 spring-bootThymeleaf

하고 싶은 일



Thymeleaf에서 링크를 생성하는 부분을 확장하고 싶습니다.

Thymeleaf에서 URL을 지정할 때 이것
<img th:src="@{/image/hoge.jpg}">

호스트 이름이 부족하지 않을 때 CDN의 호스트 이름을 링크에 추가하고 싶습니다.

ex) /image/hoge.jpg -> http://cdn.example.com/image/hoge.jpg처럼


환경


  • SpringBoot: 1.4.6.RELEASE
  • Thymeleaf: 3.0.2.RELEASE


  • 구현


    org.thymeleaf.linkbuilder.AbstractLinkBuilder 확장된 클래스를 만듭니다.

    링크를 생성하는 부분을 buildLink 메소드에 구현합니다.

    CDN의 호스트를 추가할 필요가 없는 경우는, 디폴트의 URL를 이용하고 싶기 때문에 StandardLinkBuilder를 이용하고 있습니다.
    http://example.com/xxx와 같이 시작하는 링크는 CDN 호스트를 추가하지 않습니다.
    if (UrlUtils.isAbsoluteUrl(link)) { ... }
    @Component
    public class CustomLinkBuilder extends AbstractLinkBuilder {
        private static final Logger LOGGER = LoggerFactory.getLogger(CustomLinkBuilder.class);
        private final StandardLinkBuilder standardLinkBuilder = new StandardLinkBuilder();
    
        private String cdnHost() {
            return "http://localhost:8080";
        }
    
        private boolean isImageExtention(String path) {
            return StringUtils.endsWith(path, ".jpg")
                    || StringUtils.endsWith(path, ".jpeg")
                    || StringUtils.endsWith(path, ".png")
                    || StringUtils.endsWith(path, ".gif");
        }
    
        private boolean isImageLink(UriComponents components) {
            final String path = components.getPath();
            return StringUtils.startsWith(path, "/image/") && this.isImageExtention(path);
        }
    
        @Override
        public String buildLink(final IExpressionContext context, final String base, final Map<String, Object> parameters) {
            String link = this.standardLinkBuilder.buildLink(context, base, parameters);
            LOGGER.debug("build link:{}", link);
    
            if (UrlUtils.isAbsoluteUrl(link)) {
                return link;
            }
    
            UriComponents components = UriComponentsBuilder.fromUriString(link).build();
    
            if (this.isImageLink(components)) {
                return this.cdnHost() + link;
            }
    
            return link;
        }
    }
    

    TemplateEngine에 ↑ 클래스를 설정합니다.

    디폴트의 ​​SpringTemplateEngine 에, CustomLinkBuilder 를 설정하고 싶었으므로, @Import(ThymeleafAutoConfiguration.class) 하고 있습니다.
    @Import가 없으면 SpringTemplateEngine 빈이 생성되기 전에 @Bean SpringTemplateEngine customTemplateEngine() {}가 실행되기 때문에,@Autowired private SpringTemplateEngine templateEngine가 null이되는 것 같습니다.
    @Configuration
    @Import(ThymeleafAutoConfiguration.class)
    public class WebConfig {
        @Autowired
        private SpringTemplateEngine templateEngine;
        @Autowired
        private CustomLinkBuilder customLinkBuilder;
    
        @Bean
        public SpringTemplateEngine customTemplateEngine() {
            this.templateEngine.setLinkBuilder(this.customLinkBuilder);
            return this.templateEngine;
        }
    }
    

    이제 <img th:src="@{/image/hoge/main.jpg}">와 같이 template에 쓰면,<img src="http://localhost:8080/image/hoge/main.jpg">가 표시됩니다.

    이번 소스는 이쪽이 됩니다.
    도움이되면 다행입니다
  • htps : // 기주 b. 코 m / 야마시로 0110 / Sp 링 g 보오 t / b ぉ b / 뭐 r / sp 린 게 보오 t 싯시 온 - s / src / 마이 / 자 / 코 m / 에ぁ mpぇ / sp 링g 보오 츠 삐시 온레 ぢ s / 콘후 ぃ g / ぇ b 콘후 ぃ g. 그럼
  • htps : // 기주 b. 코 m / 야마시로 0110 / Sp ring 보오 t / b ぉ b / 마s r / sp rin g 보오 t 싯시 온 - s / src / 마이 / 자 / m / eぁ mpぇ / sp 링 g 보오 츠 삐시 온레 ぢ s / ぃ 에 w / 쿠 s와 m ㎃ k 뭉치 l로 r. 그럼
  • 좋은 웹페이지 즐겨찾기