optimized @Bean error messages (SPR-7628, SPR-7629)
This commit is contained in:
parent
4e43ba544b
commit
061063257a
|
|
@ -466,7 +466,7 @@ class ConstructorResolver {
|
|||
this.beanFactory.logger.trace("Ignoring factory method [" + candidate +
|
||||
"] of bean '" + beanName + "': " + ex);
|
||||
}
|
||||
if (i == candidates.length - 1 && factoryMethodToUse == null) {
|
||||
if (i == candidates.length - 1 && argsHolderToUse == null) {
|
||||
if (causes != null) {
|
||||
for (Exception cause : causes) {
|
||||
this.beanFactory.onSuppressedException(cause);
|
||||
|
|
@ -547,7 +547,7 @@ class ConstructorResolver {
|
|||
ambiguousFactoryMethods);
|
||||
}
|
||||
|
||||
if (explicitArgs == null) {
|
||||
if (explicitArgs == null && argsHolderToUse != null) {
|
||||
argsHolderToUse.storeCache(mbd, factoryMethodToUse);
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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");
|
||||
* you may not use this file except in compliance with the License.
|
||||
|
|
@ -107,8 +107,7 @@ final class ConfigurationClass {
|
|||
|
||||
|
||||
public void validate(ProblemReporter problemReporter) {
|
||||
|
||||
// a @Bean method may only be overloaded through inheritance. No single
|
||||
// An @Bean method may only be overloaded through inheritance. No single
|
||||
// @Configuration class may declare two @Bean methods with the same name.
|
||||
final char hashDelim = '#';
|
||||
Map<String, Integer> methodNameCounts = new HashMap<String, Integer>();
|
||||
|
|
@ -134,11 +133,12 @@ final class ConfigurationClass {
|
|||
if (getMetadata().isFinal()) {
|
||||
problemReporter.error(new FinalConfigurationProblem());
|
||||
}
|
||||
}
|
||||
|
||||
for (ConfigurationClassMethod method : this.methods) {
|
||||
method.validate(problemReporter);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
|
|
@ -152,7 +152,10 @@ final class ConfigurationClass {
|
|||
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 {
|
||||
|
||||
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 {
|
||||
|
||||
public BeanMethodOverloadingProblem(String methodName, int count) {
|
||||
|
|
@ -171,5 +177,4 @@ final class ConfigurationClass {
|
|||
}
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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");
|
||||
* you may not use this file except in compliance with the License.
|
||||
|
|
@ -16,8 +16,6 @@
|
|||
|
||||
package org.springframework.context.annotation;
|
||||
|
||||
import static java.lang.String.format;
|
||||
|
||||
import org.springframework.beans.factory.parsing.Location;
|
||||
import org.springframework.beans.factory.parsing.Problem;
|
||||
import org.springframework.beans.factory.parsing.ProblemReporter;
|
||||
|
|
@ -54,18 +52,25 @@ final class ConfigurationClassMethod {
|
|||
}
|
||||
|
||||
public Location getResourceLocation() {
|
||||
return new Location(this.configurationClass.getResource(), metadata);
|
||||
return new Location(this.configurationClass.getResource(), this.metadata);
|
||||
}
|
||||
|
||||
public void validate(ProblemReporter problemReporter) {
|
||||
if (this.configurationClass.getMetadata().isAnnotated(Configuration.class.getName()) && !getMetadata().isOverridable()) {
|
||||
if (this.configurationClass.getMetadata().isAnnotated(Configuration.class.getName())) {
|
||||
if (!getMetadata().isOverridable()) {
|
||||
problemReporter.error(new NonOverridableMethodError());
|
||||
}
|
||||
}
|
||||
else {
|
||||
if (getMetadata().isStatic()) {
|
||||
problemReporter.error(new StaticMethodError());
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
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());
|
||||
}
|
||||
|
||||
|
|
@ -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());
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
|
|
|||
Loading…
Reference in New Issue