如何使弹簧数据@Async工作?错误:PersistentEntity不能为null

时间:2017-02-10 12:00:49

标签: java spring-data

当我尝试在Spring Data Repository方法上使用@Async时,我收到以下错误:

{"原因":null,"消息":" PersistentEntity不能为空!"}

好像它试图序列化CompletableFuture<>。

存储库代码:

@Query("SELECT p FROM Produto p where descricao LIKE CONCAT(UPPER(:like),'%')")
@Async
CompletableFuture<List<Produto>> findByLikeAsync(@Param("like") String like);

配置:

@SpringBootApplication
@EntityScan(basePackages = {"..."})
@EnableJpaRepositories(basePackages = {"..."})
@EnableAsync
@Configuration
public class Application implements AsyncConfigurer {
    public static void main(String[] args) {
        SpringApplication.run(Application.class, args);
    }

    @Override
    public Executor getAsyncExecutor() {
        ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();
        executor.setCorePoolSize(7);
        executor.setMaxPoolSize(42);
        executor.setQueueCapacity(11);
        executor.setThreadNamePrefix("MyExecutor-");
        executor.initialize();
        return executor;
    }

    @Override
    public AsyncUncaughtExceptionHandler getAsyncUncaughtExceptionHandler() {
        return new CustomAsyncExceptionHandler();
    }
}

我尝试过使用Future&lt;&gt;而不是CompletableFuture&lt;&gt;,但它会抛出相同的错误。

任何想法?

感谢。

1 个答案:

答案 0 :(得分:0)

假设您正在使用CrudRepository,则存储库中的方法只能返回它们注册的类(或它们的集合)。在这种情况下,如果您已将存储库定义为:

public interface ProdutoRepository extends CrudRepository<Produto, Long>

您必须返回List<Produto>。您可以创建一个调用此内容的@Service,并在其中添加一个使用@Async注释的公共方法。