From 545748b91a4f89f230db3b796d561ee2065a88f0 Mon Sep 17 00:00:00 2001 From: Henning Poettker Date: Sun, 20 Nov 2022 17:43:46 +0100 Subject: [PATCH] Add runtime hints for `TaskBatchEventListenerBeanPostProcessor` --- .../task/aot/TaskStreamRuntimeHints.java | 38 +++++++++++++ .../resources/META-INF/spring/aot.factories | 2 + .../task/aot/TaskStreamRuntimeHintsTests.java | 56 +++++++++++++++++++ 3 files changed, 96 insertions(+) create mode 100644 spring-cloud-task-stream/src/main/java/org/springframework/cloud/task/aot/TaskStreamRuntimeHints.java create mode 100644 spring-cloud-task-stream/src/main/resources/META-INF/spring/aot.factories create mode 100644 spring-cloud-task-stream/src/test/java/org/springframework/cloud/task/aot/TaskStreamRuntimeHintsTests.java diff --git a/spring-cloud-task-stream/src/main/java/org/springframework/cloud/task/aot/TaskStreamRuntimeHints.java b/spring-cloud-task-stream/src/main/java/org/springframework/cloud/task/aot/TaskStreamRuntimeHints.java new file mode 100644 index 00000000..7e5db9cb --- /dev/null +++ b/spring-cloud-task-stream/src/main/java/org/springframework/cloud/task/aot/TaskStreamRuntimeHints.java @@ -0,0 +1,38 @@ +/* + * Copyright 2022-2022 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.springframework.cloud.task.aot; + +import org.springframework.aot.hint.MemberCategory; +import org.springframework.aot.hint.RuntimeHints; +import org.springframework.aot.hint.RuntimeHintsRegistrar; +import org.springframework.batch.core.step.item.ChunkOrientedTasklet; +import org.springframework.cloud.task.batch.listener.support.TaskBatchEventListenerBeanPostProcessor; + +/** + * Registers runtime hints for {@link TaskBatchEventListenerBeanPostProcessor}. + * + * @author Henning Pöttker + * @since 3.0 + */ +public class TaskStreamRuntimeHints implements RuntimeHintsRegistrar { + + @Override + public void registerHints(RuntimeHints hints, ClassLoader classLoader) { + hints.reflection().registerType(ChunkOrientedTasklet.class, MemberCategory.DECLARED_FIELDS); + } + +} diff --git a/spring-cloud-task-stream/src/main/resources/META-INF/spring/aot.factories b/spring-cloud-task-stream/src/main/resources/META-INF/spring/aot.factories new file mode 100644 index 00000000..a6428d53 --- /dev/null +++ b/spring-cloud-task-stream/src/main/resources/META-INF/spring/aot.factories @@ -0,0 +1,2 @@ +org.springframework.aot.hint.RuntimeHintsRegistrar=\ +org.springframework.cloud.task.aot.TaskStreamRuntimeHints diff --git a/spring-cloud-task-stream/src/test/java/org/springframework/cloud/task/aot/TaskStreamRuntimeHintsTests.java b/spring-cloud-task-stream/src/test/java/org/springframework/cloud/task/aot/TaskStreamRuntimeHintsTests.java new file mode 100644 index 00000000..af257c6d --- /dev/null +++ b/spring-cloud-task-stream/src/test/java/org/springframework/cloud/task/aot/TaskStreamRuntimeHintsTests.java @@ -0,0 +1,56 @@ +/* + * Copyright 2022-2022 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.springframework.cloud.task.aot; + +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; + +import org.springframework.aot.hint.RuntimeHints; +import org.springframework.batch.core.step.item.ChunkOrientedTasklet; +import org.springframework.util.ReflectionUtils; + +import static org.assertj.core.api.Assertions.assertThat; +import static org.springframework.aot.hint.predicate.RuntimeHintsPredicates.reflection; + +/** + * @author Henning Pöttker + */ +class TaskStreamRuntimeHintsTests { + + private RuntimeHints hints; + + @BeforeEach + void setUp() { + this.hints = new RuntimeHints(); + new TaskStreamRuntimeHints().registerHints(this.hints, getClass().getClassLoader()); + } + + @Test + void reflectionOnChunkProviderFieldIsAllowed() { + var field = ReflectionUtils.findField(ChunkOrientedTasklet.class, "chunkProvider"); + assertThat(field).isNotNull(); + assertThat(reflection().onField(field)).accepts(this.hints); + } + + @Test + void reflectionOnChunkProcessorFieldIsAllowed() { + var field = ReflectionUtils.findField(ChunkOrientedTasklet.class, "chunkProcessor"); + assertThat(field).isNotNull(); + assertThat(reflection().onField(field)).accepts(this.hints); + } + +}