Приложение Spring Boot: проблема диалекта Hibernate при внедрении зависимостей в Filter - PullRequest
0 голосов
/ 22 октября 2018

У меня есть приложение Spring Boot, подключенное к базе данных Phoenix.Для связи с базой данных я использую диалект Hibernate: com.ruesga.phoenix.dialect.PhoenixDialect.

Это работало нормально.

Недавно я добавил фильтр на каждыйЗапрос API.

Вот как выглядит мой фильтр:

@Component
public class ConsoleLogFilter implements Filter {

    ConsoleLogFilter() {
    }

    @Override
    public void init(FilterConfig fc) throws ServletException {
    }

    @Override
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
        System.out.println("SOME TEXT");
        chain.doFilter(request, response);
    }

    @Override
    public void destroy() {
    }
}

Фильтр печатает желаемый вывод при каждом вызове API, и связь с моей базой данных работает нормально.

Вот когда все становится сложнее: Конечно, я хотел, чтобы мой фильтр делал больше, чем просто печать простого текста, поэтому я добавил сервис в этот фильтр.

@Component
public class ConsoleLogFilter implements Filter {

    private MyService myService;

    ConsoleLogFilter() {
    }

    @Override
    public void init(FilterConfig fc) throws ServletException {
    }

    @Override
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
        System.out.println("SOME TEXT");
        myService.printHello();
        chain.doFilter(request, response);
    }

    @Override
    public void destroy() {
    }
}

Чтобы получить свой сервис в фильтре, япробовал несколько вариантов внедрения зависимостей:

  • Вариант 1: я использовал @Autowired в объявлении сервиса

    @Autowired
    private MyService myService;
    
  • Вариант 2: Iпереопределил метод init для извлечения Сервиса из контекста

    @Override
    public void init(FilterConfig fc) throws ServletException {
        ApplicationContext ctx = WebApplicationContextUtils
          .getRequiredWebApplicationContext(fc.getServletContext());
        this.myService = ctx.getBean(MyService.class);
    }
    
  • Вариант 3: я добавил конструктор, который принимает MyService в качестве параметра и создает экземпляр моего ConsoleLogFilter из Spring SeФайл curityConfig.java

    ConsoleLogFilter(MyService myService) {
         this.myService = myService;
    }
    

Во всех трех случаях внедрение зависимостей работает нормально в том смысле, что мой сервис правильно извлекается и вызывается.

Но затем, в качестве побочного эффекта, все маршруты API, которые записывают данные в базу данных, завершаются с ошибкой:

16:27:52.207 [http-nio-4242-exec-3] WARN  o.h.e.jdbc.spi.SqlExceptionHelper - SQL Error: 601, SQLState: 42P00
16:27:52.208 [http-nio-4242-exec-3] ERROR o.h.e.jdbc.spi.SqlExceptionHelper - ERROR 601 (42P00): Syntax error. Encountered "insert" at line 1, column 1.
16:27:52.209 [http-nio-4242-exec-3] ERROR o.h.i.ExceptionMapperStandardImpl - HHH000346: Error during managed flush [org.hibernate.exception.SQLGrammarException: could not prepare statement]
16:27:52.218 [http-nio-4242-exec-3] ERROR com.advizeo.api.GeneralApiUtils - could not prepare statement; SQL [insert into EVENT_STORE (EVENT_TYPE, PAYLOAD, AGGREGATE_ID, AGGREGATE_TYPE, CREATION_DATE) values (?, ?, ?, ?, ?)]; nested exception is org.hibernate.exception.SQLGrammarException: could not prepare statement

Как будто диалект Phoenix больше не распознается, и Hibernate генерирует операторы INSERT вместоЗаявления UPSERT.

Может ли кто-нибудь помочь мне понять, почему не используется правильный диалект?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...