Spring + Thymeleaf Engine Обработка ошибок и ведение журнала

Наша компания находится в процессе переключения нашего механизма шаблонов с 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, когда я пробовал это в последний раз.

Тем не менее, если у кого-то есть лучший подход, я хотел бы его услышать. Я новичок во всей этой публикации вопросов; я должен опубликовать ответ?

Используйте Spring Integration Adapter проверьте youtube.com/watch?v=oLoPpKq3JgU. Вы можете опубликовать свой ответ и принять его, пока не будет дан лучший ответ.

Sully 02.03.2019 05:38
1
1
764
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Подход с фильтром в конечном итоге сработал, но 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;
    }

Другие вопросы по теме