Browse Source

improved NoClassDefFoundError handling during constructor resolution (SPR-5522)

git-svn-id: https://src.springframework.org/svn/spring-framework/trunk@688 50f2f4bb-b051-0410-bef5-90022cba6387
pull/1/head
Juergen Hoeller 17 years ago
parent
commit
e7f99fd584
  1. 34
      org.springframework.beans/src/main/java/org/springframework/beans/factory/support/ConstructorResolver.java

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

@ -1,5 +1,5 @@ @@ -1,5 +1,5 @@
/*
* Copyright 2002-2008 the original author or authors.
* Copyright 2002-2009 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.
@ -102,7 +102,7 @@ class ConstructorResolver { @@ -102,7 +102,7 @@ class ConstructorResolver {
* or <code>null</code> if none (-> use constructor argument values from bean definition)
* @return a BeanWrapper for the new instance
*/
protected BeanWrapper autowireConstructor(
public BeanWrapper autowireConstructor(
String beanName, RootBeanDefinition mbd, Constructor[] chosenCtors, Object[] explicitArgs) {
BeanWrapperImpl bw = new BeanWrapperImpl();
@ -148,7 +148,7 @@ class ConstructorResolver { @@ -148,7 +148,7 @@ class ConstructorResolver {
mbd.getResolvedAutowireMode() == RootBeanDefinition.AUTOWIRE_CONSTRUCTOR);
ConstructorArgumentValues resolvedValues = null;
int minNrOfArgs = 0;
int minNrOfArgs;
if (explicitArgs != null) {
minNrOfArgs = explicitArgs.length;
}
@ -159,8 +159,18 @@ class ConstructorResolver { @@ -159,8 +159,18 @@ class ConstructorResolver {
}
// Take specified constructors, if any.
Constructor[] candidates =
(chosenCtors != null ? chosenCtors : mbd.getBeanClass().getDeclaredConstructors());
Constructor[] candidates = chosenCtors;
if (candidates == null) {
Class beanClass = mbd.getBeanClass();
try {
candidates = beanClass.getDeclaredConstructors();
}
catch (Throwable ex) {
throw new BeanCreationException(mbd.getResourceDescription(), beanName,
"Resolution of declared constructors on bean Class [" + beanClass.getName() +
"] from ClassLoader [" + beanClass.getClassLoader() + "] failed", ex);
}
}
AutowireUtils.sortConstructors(candidates);
int minTypeDiffWeight = Integer.MAX_VALUE;
@ -180,7 +190,7 @@ class ConstructorResolver { @@ -180,7 +190,7 @@ class ConstructorResolver {
"(hint: specify index and/or type arguments for simple parameters to avoid type ambiguities)");
}
ArgumentsHolder args = null;
ArgumentsHolder args;
List<Exception> causes = null;
if (resolvedValues != null) {
@ -270,9 +280,9 @@ class ConstructorResolver { @@ -270,9 +280,9 @@ class ConstructorResolver {
BeanWrapperImpl bw = new BeanWrapperImpl();
this.beanFactory.initBeanWrapper(bw);
Class factoryClass = null;
Object factoryBean = null;
boolean isStatic = true;
Object factoryBean;
Class factoryClass;
boolean isStatic;
String factoryBeanName = mbd.getFactoryBeanName();
if (factoryBeanName != null) {
@ -290,7 +300,9 @@ class ConstructorResolver { @@ -290,7 +300,9 @@ class ConstructorResolver {
}
else {
// It's a static factory method on the bean class.
factoryBean = null;
factoryClass = mbd.getBeanClass();
isStatic = true;
}
Method factoryMethodToUse = null;
@ -335,7 +347,7 @@ class ConstructorResolver { @@ -335,7 +347,7 @@ class ConstructorResolver {
int minTypeDiffWeight = Integer.MAX_VALUE;
ConstructorArgumentValues resolvedValues = null;
int minNrOfArgs = 0;
int minNrOfArgs;
if (explicitArgs != null) {
minNrOfArgs = explicitArgs.length;
}
@ -357,7 +369,7 @@ class ConstructorResolver { @@ -357,7 +369,7 @@ class ConstructorResolver {
candidate.getName().equals(mbd.getFactoryMethodName()) &&
paramTypes.length >= minNrOfArgs) {
ArgumentsHolder args = null;
ArgumentsHolder args;
if (resolvedValues != null) {
// Resolved contructor arguments: type conversion and/or autowiring necessary.

Loading…
Cancel
Save