Reject @Bean method with void return type

Closes gh-31007
This commit is contained in:
Juergen Hoeller 2023-08-07 15:00:08 +02:00
parent 3c34e69cc2
commit d3d414c3c7
2 changed files with 30 additions and 2 deletions

View File

@ -42,8 +42,13 @@ final class BeanMethod extends ConfigurationMethod {
@Override
public void validate(ProblemReporter problemReporter) {
if ("void".equals(getMetadata().getReturnTypeName())) {
// declared as void: potential misuse of @Bean, maybe meant as init method instead?
problemReporter.error(new VoidDeclaredMethodError());
}
if (getMetadata().isStatic()) {
// static @Bean methods have no constraints to validate -> return immediately
// static @Bean methods have no further constraints to validate -> return immediately
return;
}
@ -71,6 +76,15 @@ final class BeanMethod extends ConfigurationMethod {
}
private class VoidDeclaredMethodError extends Problem {
VoidDeclaredMethodError() {
super("@Bean method '%s' must not be declared as void; change the method's return type or its annotation."
.formatted(getMetadata().getMethodName()), getResourceLocation());
}
}
private class NonOverridableMethodError extends Problem {
NonOverridableMethodError() {

View File

@ -1,5 +1,5 @@
/*
* Copyright 2002-2022 the original author or authors.
* Copyright 2002-2023 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.
@ -143,6 +143,12 @@ class ConfigurationClassProcessingTests {
initBeanFactory(ConfigWithFinalBean.class));
}
@Test // gh-31007
void voidBeanMethod() {
assertThatExceptionOfType(BeanDefinitionParsingException.class).isThrownBy(() ->
initBeanFactory(ConfigWithVoidBean.class));
}
@Test
void simplestPossibleConfig() {
BeanFactory factory = initBeanFactory(SimplestPossibleConfig.class);
@ -432,6 +438,14 @@ class ConfigurationClassProcessingTests {
}
@Configuration
static class ConfigWithVoidBean {
public @Bean void testBean() {
}
}
@Configuration
static class SimplestPossibleConfig {