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
처럼환경
구현
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">
가 표시됩니다.이번 소스는 이쪽이 됩니다.
도움이되면 다행입니다
Reference
이 문제에 관하여(Spring Boot + Thymeleaf로 SpringTemplateEngine 사용자 정의), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://qiita.com/RyoTa63292153/items/99530cd68ead2a03fc19텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)