From 061063257ab8e16786d04eaddb5b5aba61dcd7f1 Mon Sep 17 00:00:00 2001 From: Juergen Hoeller Date: Sun, 10 Oct 2010 18:31:03 +0000 Subject: [PATCH] optimized @Bean error messages (SPR-7628, SPR-7629) --- .../factory/support/ConstructorResolver.java | 4 +-- .../annotation/ConfigurationClass.java | 23 ++++++++------ .../annotation/ConfigurationClassMethod.java | 30 ++++++++++++++----- 3 files changed, 39 insertions(+), 18 deletions(-) diff --git a/org.springframework.beans/src/main/java/org/springframework/beans/factory/support/ConstructorResolver.java b/org.springframework.beans/src/main/java/org/springframework/beans/factory/support/ConstructorResolver.java index 491a0a1e15..3a769c85d2 100644 --- a/org.springframework.beans/src/main/java/org/springframework/beans/factory/support/ConstructorResolver.java +++ b/org.springframework.beans/src/main/java/org/springframework/beans/factory/support/ConstructorResolver.java @@ -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); } } diff --git a/org.springframework.context/src/main/java/org/springframework/context/annotation/ConfigurationClass.java b/org.springframework.context/src/main/java/org/springframework/context/annotation/ConfigurationClass.java index 4aefbf5497..ce069f4d4e 100644 --- a/org.springframework.context/src/main/java/org/springframework/context/annotation/ConfigurationClass.java +++ b/org.springframework.context/src/main/java/org/springframework/context/annotation/ConfigurationClass.java @@ -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 methodNameCounts = new HashMap(); @@ -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 { } } - } diff --git a/org.springframework.context/src/main/java/org/springframework/context/annotation/ConfigurationClassMethod.java b/org.springframework.context/src/main/java/org/springframework/context/annotation/ConfigurationClassMethod.java index c6b96ce7e0..a176db7dda 100644 --- a/org.springframework.context/src/main/java/org/springframework/context/annotation/ConfigurationClassMethod.java +++ b/org.springframework.context/src/main/java/org/springframework/context/annotation/ConfigurationClassMethod.java @@ -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()) { - 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()); + } + } + }