Наша компания находится в процессе переключения нашего механизма шаблонов с Velocity на Thymeleaf. Мы используем Splunk для ведения журнала, а с помощью Velocity мы смогли реализовать org.apache.velocity.runtime.log.LogChute для обработки пользовательского ведения журнала (формат и запись в наш журнал splunk), но мне не удалось найти аналогичный класс для Thymeleaf.
Я пробовал пару подходов до сих пор. Во-первых, я попытался расширить настоящий движок Thymeleaf и добавить обертку try/catch вокруг метода процесса, но, к сожалению, этот метод является окончательным. Я видел предложение добавить фильтр для перехвата ошибок тимелеафа, но что-то должно поглощать ошибку, потому что она никогда не достигает этого блока перехвата.
Единственный вариант, который я могу придумать на данный момент, — это просто вытащить журналы org.thymeleaf.TemplateEngine в наш журнал splunk, но тогда он не будет правильно отформатирован для приема, и я не смогу добавить какие-либо настраиваемые поля.
У кого-нибудь есть идеи?
Обновлено:
Вау, я только что повторил подход с фильтром, и он сработал, но пойманным исключением было org.springframework.web.util.NestedServletException, поэтому JRebel, должно быть, не перезагрузил мои изменения, чтобы поймать Exception вместо TemplateEngineException, когда я пробовал это в последний раз.
Тем не менее, если у кого-то есть лучший подход, я хотел бы его услышать. Я новичок во всей этой публикации вопросов; я должен опубликовать ответ?
Подход с фильтром в конечном итоге сработал, но TemplateEngineException обернут NestedServletException.
import java.io.IOException;
import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import org.springframework.web.util.NestedServletException;
import org.thymeleaf.exceptions.TemplateEngineException;
/**
* Filter to catch Thymeleaf template errors
*/
public class ThymeleafErrorFilter implements Filter {
@Override
public void init(final FilterConfig filterConfig) {
}
@Override
public void doFilter(final ServletRequest servletRequest, final ServletResponse servletResponse, final FilterChain filterChain) throws IOException, ServletException {
try {
filterChain.doFilter(servletRequest, servletResponse);
} catch (final NestedServletException nse) {
if (nse.getCause() instanceof TemplateEngineException) {
//Do stuff here
...
}
throw nse;
}
}
@Override
public void destroy() {
}
}
И затем регистрация фильтра
/**
* @return thymeleaf error filter
*/
@Bean
public FilterRegistrationBean thymeleafErrorFilter() {
FilterRegistrationBean thymeleafErrorFilter = new FilterRegistrationBean();
thymeleafErrorFilter.setName("thymeleafErrorFilter");
thymeleafErrorFilter.setFilter(new ThymeleafErrorFilter());
thymeleafErrorFilter.addUrlPatterns("/*");
return thymeleafErrorFilter;
}
Используйте Spring Integration Adapter проверьте youtube.com/watch?v=oLoPpKq3JgU. Вы можете опубликовать свой ответ и принять его, пока не будет дан лучший ответ.