提交 06106325 编写于 作者: J Juergen Hoeller

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

上级 4e43ba54
......@@ -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);
}
}
......
/*
* 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,9 +133,10 @@ final class ConfigurationClass {
if (getMetadata().isFinal()) {
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();
}
/** 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 {
}
}
}
/*
* 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()) {
problemReporter.error(new NonOverridableMethodError());
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());
}
}
}
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册