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 +
|
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);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -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 {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -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());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue