Spring Integration с JPA возвращает ошибку :: У запроса есть параметры, но источник параметров не предоставлен - PullRequest
0 голосов
/ 09 марта 2019

Я пытаюсь опрашивать базу данных каждые 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 голос
/ 09 марта 2019

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

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 по этому вопросу.

...