Browse Source

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

pull/1234/head
Juergen Hoeller 14 years ago
parent
commit
061063257a
  1. 4
      org.springframework.beans/src/main/java/org/springframework/beans/factory/support/ConstructorResolver.java
  2. 23
      org.springframework.context/src/main/java/org/springframework/context/annotation/ConfigurationClass.java
  3. 30
      org.springframework.context/src/main/java/org/springframework/context/annotation/ConfigurationClassMethod.java

4
org.springframework.beans/src/main/java/org/springframework/beans/factory/support/ConstructorResolver.java

@ -466,7 +466,7 @@ class ConstructorResolver { @@ -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 { @@ -547,7 +547,7 @@ class ConstructorResolver {
ambiguousFactoryMethods);
}
if (explicitArgs == null) {
if (explicitArgs == null && argsHolderToUse != null) {
argsHolderToUse.storeCache(mbd, factoryMethodToUse);
}
}

23
org.springframework.context/src/main/java/org/springframework/context/annotation/ConfigurationClass.java

@ -1,5 +1,5 @@ @@ -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 { @@ -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 { @@ -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 { @@ -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 { @@ -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 { @@ -171,5 +177,4 @@ final class ConfigurationClass {
}
}
}

30
org.springframework.context/src/main/java/org/springframework/context/annotation/ConfigurationClassMethod.java

@ -1,5 +1,5 @@ @@ -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 @@ @@ -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 { @@ -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 { @@ -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…
Cancel
Save