Интеграция Spring с JPA возвращает ошибку :: Запрос имеет параметры, но источник параметров не предоставлен

#java #jpa #spring-integration

#java #jpa #spring-интеграция

Вопрос:

Я пытаюсь опрашивать базу данных каждые 5 секунд и хочу получать любые записи, созданные / обновленные за последние 5 секунд.

Вот блок кода

 @Bean
    public JpaExecutor jpaExecutor() {
        JpaExecutor executor = new JpaExecutor(this.entityManagerFactory);
        executor.setJpaQuery("from Product p where p.updateDttm >= :updateDttm");
        executor.setJpaParameters(Collections.singletonList(new JpaParameter("updateDttm", "2019-02-28 12:02:15.000", null)));
        return executor;
    }
  

Вот ошибка, которую я получаю

 ERROR 908 --- [ask-scheduler-8] o.s.integration.handler.LoggingHandler   : org.springframework.messaging.MessagingException: nested exception is java.lang.IllegalArgumentException: Query has parameters but no parameter source provided
    at org.springframework.integration.endpoint.AbstractPollingEndpoint.pollForMessage(AbstractPollingEndpoint.java:343)
    at org.springframework.integration.endpoint.AbstractPollingEndpoint.lambda$null$1(AbstractPollingEndpoint.java:277)
    at org.springframework.integration.util.ErrorHandlingTaskExecutor.lambda$execute$0(ErrorHandlingTaskExecutor.java:57)
    at org.springframework.core.task.SyncTaskExecutor.execute(SyncTaskExecutor.java:50)
    at org.springframework.integration.util.ErrorHandlingTaskExecutor.execute(ErrorHandlingTaskExecutor.java:55)
    at org.springframework.integration.endpoint.AbstractPollingEndpoint.lambda$createPoller$2(AbstractPollingEndpoint.java:274)
    at org.springframework.scheduling.support.DelegatingErrorHandlingRunnable.run(DelegatingErrorHandlingRunnable.java:54)
    at org.springframework.scheduling.concurrent.ReschedulingRunnable.run(ReschedulingRunnable.java:93)
    at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511)
    at java.util.concurrent.FutureTask.run(FutureTask.java:266)
    at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.access$201(ScheduledThreadPoolExecutor.java:180)
    at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.run(ScheduledThreadPoolExecutor.java:293)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
    at java.lang.Thread.run(Thread.java:748)
Caused by: java.lang.IllegalArgumentException: Query has parameters but no parameter source provided
    at org.springframework.integration.jpa.core.DefaultJpaOperations.setParametersIfRequired(DefaultJpaOperations.java:348)
    at org.springframework.integration.jpa.core.DefaultJpaOperations.getQuery(DefaultJpaOperations.java:117)
    at org.springframework.integration.jpa.core.DefaultJpaOperations.getResultListForQuery(DefaultJpaOperations.java:190)
    at org.springframework.integration.jpa.core.JpaExecutor.doPoll(JpaExecutor.java:569)
    at org.springframework.integration.jpa.core.JpaExecutor.poll(JpaExecutor.java:505)
    at org.springframework.integration.jpa.core.JpaExecutor.poll(JpaExecutor.java:476)
    at org.springframework.integration.jpa.inbound.JpaPollingChannelAdapter.doReceive(JpaPollingChannelAdapter.java:82)
    at org.springframework.integration.endpoint.AbstractMessageSource.receive(AbstractMessageSource.java:160)
    at org.springframework.integration.endpoint.SourcePollingChannelAdapter.receiveMessage(SourcePollingChannelAdapter.java:250)
    at org.springframework.integration.endpoint.AbstractPollingEndpoint.doPoll(AbstractPollingEndpoint.java:360)
    at org.springframework.integration.endpoint.AbstractPollingEndpoint.pollForMessage(AbstractPollingEndpoint.java:329)
  

Комментарии:

1. смогли ли вы найти решение?

Ответ №1:

Ваше выполнение заканчивается с этой логикой:

 if (requestMessage == null) {
            result = doPoll(this.parameterSource, 0, maxNumberOfResults);
        }
  

похоже, что вы не this.parameterSource настроили.

Его можно настроить через:

 /**
 * Specify the {@link ParameterSource} that would be used to provide
 * additional parameters.
 * @param parameterSource Must not be null.
 */
public void setParameterSource(ParameterSource parameterSource) {
  

Однако вам нужно будет отказаться от этого, executor.setJpaParameters если в пользу установщика на BeanPropertyParameterSourceFactory.setStaticParameters() . createParameterSource(null) Может быть использован для выполнения этого setParameterSource() на
JpaExecutor .

Я думаю, мы можем рассмотреть некоторые улучшения в этом вопросе, чтобы создать ParameterSource внутренне для опроса, как мы делаем для parameterSourceFactory в случае исходящих операций.

Не стесняйтесь поднимать проблему GH по этому вопросу.