diff --git a/spring-kafka/src/main/java/org/springframework/kafka/annotation/KafkaListenerAnnotationBeanPostProcessor.java b/spring-kafka/src/main/java/org/springframework/kafka/annotation/KafkaListenerAnnotationBeanPostProcessor.java index d6fac42c..0ce6f27c 100644 --- a/spring-kafka/src/main/java/org/springframework/kafka/annotation/KafkaListenerAnnotationBeanPostProcessor.java +++ b/spring-kafka/src/main/java/org/springframework/kafka/annotation/KafkaListenerAnnotationBeanPostProcessor.java @@ -325,7 +325,6 @@ public class KafkaListenerAnnotationBeanPostProcessor for (KafkaListener classLevelListener : classLevelListeners) { MultiMethodKafkaListenerEndpoint endpoint = new MultiMethodKafkaListenerEndpoint<>(checkedMethods, bean); - endpoint.setBeanFactory(this.beanFactory); processListener(endpoint, classLevelListener, bean, bean.getClass(), beanName); } } @@ -334,11 +333,6 @@ public class KafkaListenerAnnotationBeanPostProcessor Method methodToUse = checkProxy(method, bean); MethodKafkaListenerEndpoint endpoint = new MethodKafkaListenerEndpoint<>(); endpoint.setMethod(methodToUse); - endpoint.setBeanFactory(this.beanFactory); - String errorHandlerBeanName = resolveExpressionAsString(kafkaListener.errorHandler(), "errorHandler"); - if (StringUtils.hasText(errorHandlerBeanName)) { - endpoint.setErrorHandler(this.beanFactory.getBean(errorHandlerBeanName, KafkaListenerErrorHandler.class)); - } processListener(endpoint, kafkaListener, bean, methodToUse, beanName); } @@ -405,6 +399,11 @@ public class KafkaListenerAnnotationBeanPostProcessor } } + endpoint.setBeanFactory(this.beanFactory); + String errorHandlerBeanName = resolveExpressionAsString(kafkaListener.errorHandler(), "errorHandler"); + if (StringUtils.hasText(errorHandlerBeanName)) { + endpoint.setErrorHandler(this.beanFactory.getBean(errorHandlerBeanName, KafkaListenerErrorHandler.class)); + } this.registrar.registerEndpoint(endpoint, factory); } diff --git a/spring-kafka/src/test/java/org/springframework/kafka/annotation/EnableKafkaIntegrationTests.java b/spring-kafka/src/test/java/org/springframework/kafka/annotation/EnableKafkaIntegrationTests.java index 2869b986..5cf5c7a3 100644 --- a/spring-kafka/src/test/java/org/springframework/kafka/annotation/EnableKafkaIntegrationTests.java +++ b/spring-kafka/src/test/java/org/springframework/kafka/annotation/EnableKafkaIntegrationTests.java @@ -281,6 +281,8 @@ public class EnableKafkaIntegrationTests { template.flush(); assertThat(this.multiListener.latch1.await(60, TimeUnit.SECONDS)).isTrue(); assertThat(this.multiListener.latch2.await(60, TimeUnit.SECONDS)).isTrue(); + template.send("annotated8", 0, 1, "junk"); + assertThat(this.multiListener.errorLatch.await(60, TimeUnit.SECONDS)).isTrue(); } @Test @@ -1273,18 +1275,33 @@ public class EnableKafkaIntegrationTests { return latch2; } + @Bean + public KafkaListenerErrorHandler consumeMultiMethodException(MultiListenerBean listener) { + return (m, e) -> { + listener.errorLatch.countDown(); + return null; + }; + } + } - @KafkaListener(id = "multi", topics = "annotated8") + @KafkaListener(id = "multi", topics = "annotated8", errorHandler = "consumeMultiMethodException") static class MultiListenerBean { private final CountDownLatch latch1 = new CountDownLatch(1); private final CountDownLatch latch2 = new CountDownLatch(1); + private final CountDownLatch errorLatch = new CountDownLatch(1); + @KafkaHandler public void bar(@NonNull String bar) { - latch1.countDown(); + if ("junk".equals(bar)) { + throw new RuntimeException("intentional"); + } + else { + this.latch1.countDown(); + } } @KafkaHandler