У меня есть приложение 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.
Может ли кто-нибудь помочь мне понять, почему не используется правильный диалект?