Pessoal, Boa Noite!
A minha dúvida é a seguinte: Estou fazendo um pequeno Framework relativo a envio de emails para ser utilizada pela comunidade. Nesse Framework há a possibilidade de envio de emails pré-definidos. Para resolver os arquivos HTML (no meu projeto externo .jar) usando o Thymeleaf estou utilizando o seguinte código:
//Aqui eu construo um Template Resolver específico (FileTemplateResolver) e adiciono ele ao
// SpringTemplateEngine já criado (pelo Spring Boot) com a prioridade mais baixa,
// para resolver os arquivos HTML que estão no meu projeto externo na pasta
// resources/templates/mailTemplates/templatesPreDefined.
@PostConstruct
public void customTemplateResolver(){
try {
templateEngine.addTemplateResolver(getTemplateResolver());
} catch (Exception e) {
LOGGER.debug("Não foi possível definir um template resolver customizado para que seja utilizado"
+ " os templates pré definidos.", e);
}
}
private ITemplateResolver getTemplateResolver() throws CustomTemplateResolverException {
FileTemplateResolver resolver = new FileTemplateResolver();
resolver.setPrefix(getPrefixTemplateResolver());
resolver.setSuffix(".html");
resolver.setTemplateMode("HTML5");
resolver.setCharacterEncoding("UTF-8");
resolver.setCacheable(false);
resolver.setOrder(Ordered.LOWEST_PRECEDENCE);
return resolver;
}
private String getPrefixTemplateResolver() throws CustomTemplateResolverException{
try {
return getClass().getProtectionDomain().getCodeSource().getLocation().toURI().getPath()
+ "templates" + BARRA + "mailTemplates" + BARRA + "templatesPredefined" + BARRA;
} catch (URISyntaxException e) {
LOGGER.debug("Não foi possível obter o prefixo (classpath) do template resolver.", e);
throw new CustomTemplateResolverException("Não foi possível obter o prefixo (classpath) do template resolver.", e);
}
}
//No código abaixo é onde eu processo os arquivos HTML do meu projeto externo.
@Autowired
private TemplateEngine templateEngine;
@Autowired
private Context context;
templateEngine.process("mailTemplate", context)
Isso funciona muito bem, porém afim de deixar o código mais organizado não gostaria de colocar todos os css dentro do HTML e sim em um arquivo externo que venho importá-lô depois. Porém quando utilizo o código abaixo (th:href="@{/css/app/app.css}") recebo o seguinte erro: Link base “/css/app/app.css” cannot be context relative (/) or page relative unless you implement the org.thymeleaf.context.IWebContext interface (context is of class: org.thymeleaf.context.Context) (mailTemplate:4)
<!DOCTYPE html>
<html lang="en" xmlns="http://www.w3.org/1999/xhtml" xmlns:th="http://www.thymeleaf.org">
<head>
//Eu preciso importar esse "app.css" que está na pasta
//resources/static/css/app/app.css do meu projeto externo.
<link id="appcss" rel="stylesheet" th:href="@{/css/app/app.css}" />
</head>
<body>
Mail Template
</body>
</html>
Esse meu projeto irá rodar como uma biblioteca externa ao projeto principal, portanto o contexto e o path que tenho é do projeto principal. Como faço para definir uma pasta de resources e fazer com que o thymeleaf identifique a mesma na importação de recursos em um projeto que irá executar como uma biblioteca (.jar)?
Obs: Os dois projetos (principal e secundário) estão usando o Spring Boot 1.4 e consequentemente a versão agregada do Thymeleaf.
Desde já agradeço a atenção de todos. Muito Obrigado!