optimized @Bean error messages (SPR-7628, SPR-7629)

This commit is contained in:
Juergen Hoeller 2010-10-10 18:31:03 +00:00
parent 4e43ba544b
commit 061063257a
3 changed files with 39 additions and 18 deletions

View File

@ -466,7 +466,7 @@ class ConstructorResolver {
this.beanFactory.logger.trace("Ignoring factory method [" + candidate + this.beanFactory.logger.trace("Ignoring factory method [" + candidate +
"] of bean '" + beanName + "': " + ex); "] of bean '" + beanName + "': " + ex);
} }
if (i == candidates.length - 1 && factoryMethodToUse == null) { if (i == candidates.length - 1 && argsHolderToUse == null) {
if (causes != null) { if (causes != null) {
for (Exception cause : causes) { for (Exception cause : causes) {
this.beanFactory.onSuppressedException(cause); this.beanFactory.onSuppressedException(cause);
@ -547,7 +547,7 @@ class ConstructorResolver {
ambiguousFactoryMethods); ambiguousFactoryMethods);
} }
if (explicitArgs == null) { if (explicitArgs == null && argsHolderToUse != null) {
argsHolderToUse.storeCache(mbd, factoryMethodToUse); argsHolderToUse.storeCache(mbd, factoryMethodToUse);
} }
} }

View File

@ -1,5 +1,5 @@
/* /*
* Copyright 2002-2009 the original author or authors. * Copyright 2002-2010 the original author or authors.
* *
* Licensed under the Apache License, Version 2.0 (the "License"); * Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License. * you may not use this file except in compliance with the License.
@ -107,8 +107,7 @@ final class ConfigurationClass {
public void validate(ProblemReporter problemReporter) { public void validate(ProblemReporter problemReporter) {
// An @Bean method may only be overloaded through inheritance. No single
// a @Bean method may only be overloaded through inheritance. No single
// @Configuration class may declare two @Bean methods with the same name. // @Configuration class may declare two @Bean methods with the same name.
final char hashDelim = '#'; final char hashDelim = '#';
Map<String, Integer> methodNameCounts = new HashMap<String, Integer>(); Map<String, Integer> methodNameCounts = new HashMap<String, Integer>();
@ -134,9 +133,10 @@ final class ConfigurationClass {
if (getMetadata().isFinal()) { if (getMetadata().isFinal()) {
problemReporter.error(new FinalConfigurationProblem()); problemReporter.error(new FinalConfigurationProblem());
} }
for (ConfigurationClassMethod method : this.methods) { }
method.validate(problemReporter);
} for (ConfigurationClassMethod method : this.methods) {
method.validate(problemReporter);
} }
} }
@ -152,7 +152,10 @@ final class ConfigurationClass {
return getMetadata().getClassName().hashCode(); return getMetadata().getClassName().hashCode();
} }
/** Configuration classes must be non-final to accommodate CGLIB subclassing. */
/**
* Configuration classes must be non-final to accommodate CGLIB subclassing.
*/
private class FinalConfigurationProblem extends Problem { private class FinalConfigurationProblem extends Problem {
public FinalConfigurationProblem() { public FinalConfigurationProblem() {
@ -161,7 +164,10 @@ final class ConfigurationClass {
} }
} }
/** Bean methods on configuration classes may only be overloaded through inheritance. */
/**
* Bean methods on configuration classes may only be overloaded through inheritance.
*/
private class BeanMethodOverloadingProblem extends Problem { private class BeanMethodOverloadingProblem extends Problem {
public BeanMethodOverloadingProblem(String methodName, int count) { public BeanMethodOverloadingProblem(String methodName, int count) {
@ -171,5 +177,4 @@ final class ConfigurationClass {
} }
} }
} }

View File

@ -1,5 +1,5 @@
/* /*
* Copyright 2002-2009 the original author or authors. * Copyright 2002-2010 the original author or authors.
* *
* Licensed under the Apache License, Version 2.0 (the "License"); * Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License. * you may not use this file except in compliance with the License.
@ -16,8 +16,6 @@
package org.springframework.context.annotation; package org.springframework.context.annotation;
import static java.lang.String.format;
import org.springframework.beans.factory.parsing.Location; import org.springframework.beans.factory.parsing.Location;
import org.springframework.beans.factory.parsing.Problem; import org.springframework.beans.factory.parsing.Problem;
import org.springframework.beans.factory.parsing.ProblemReporter; import org.springframework.beans.factory.parsing.ProblemReporter;
@ -54,18 +52,25 @@ final class ConfigurationClassMethod {
} }
public Location getResourceLocation() { public Location getResourceLocation() {
return new Location(this.configurationClass.getResource(), metadata); return new Location(this.configurationClass.getResource(), this.metadata);
} }
public void validate(ProblemReporter problemReporter) { public void validate(ProblemReporter problemReporter) {
if (this.configurationClass.getMetadata().isAnnotated(Configuration.class.getName()) && !getMetadata().isOverridable()) { if (this.configurationClass.getMetadata().isAnnotated(Configuration.class.getName())) {
problemReporter.error(new NonOverridableMethodError()); if (!getMetadata().isOverridable()) {
problemReporter.error(new NonOverridableMethodError());
}
}
else {
if (getMetadata().isStatic()) {
problemReporter.error(new StaticMethodError());
}
} }
} }
@Override @Override
public String toString() { public String toString() {
return format("[%s:name=%s,declaringClass=%s]", return String.format("[%s:name=%s,declaringClass=%s]",
this.getClass().getSimpleName(), this.getMetadata().getMethodName(), this.getMetadata().getDeclaringClassName()); this.getClass().getSimpleName(), this.getMetadata().getMethodName(), this.getMetadata().getDeclaringClassName());
} }
@ -82,4 +87,15 @@ final class ConfigurationClassMethod {
} }
/**
* {@link Bean} methods must at least not be static in the non-CGLIB case.
*/
private class StaticMethodError extends Problem {
public StaticMethodError() {
super(String.format("Method '%s' must not be static; remove the method's static modifier to continue",
getMetadata().getMethodName()), getResourceLocation());
}
}
} }