Consistently handle NoClassDefFoundError in BeanUtils and related places
Issue: SPR-16369
This commit is contained in:
@@ -107,9 +107,10 @@ public abstract class BeanUtils {
|
|||||||
* @return the new instance
|
* @return the new instance
|
||||||
* @throws BeanInstantiationException if the bean cannot be instantiated.
|
* @throws BeanInstantiationException if the bean cannot be instantiated.
|
||||||
* The cause may notably indicate a {@link NoSuchMethodException} if no
|
* The cause may notably indicate a {@link NoSuchMethodException} if no
|
||||||
* primary/default constructor was found - or an exception thrown from
|
* primary/default constructor was found, a {@link NoClassDefFoundError}
|
||||||
* the constructor invocation attempt, including a runtime-generated
|
* or other {@link LinkageError} in case of an unresolvable class definition
|
||||||
* {@link NoClassDefFoundError} in case of an unresolvable dependency.
|
* (e.g. due to a missing dependency at runtime), or an exception thrown
|
||||||
|
* from the constructor invocation itself.
|
||||||
* @see Constructor#newInstance
|
* @see Constructor#newInstance
|
||||||
*/
|
*/
|
||||||
public static <T> T instantiateClass(Class<T> clazz) throws BeanInstantiationException {
|
public static <T> T instantiateClass(Class<T> clazz) throws BeanInstantiationException {
|
||||||
@@ -125,6 +126,9 @@ public abstract class BeanUtils {
|
|||||||
catch (NoSuchMethodException ex) {
|
catch (NoSuchMethodException ex) {
|
||||||
throw new BeanInstantiationException(clazz, "No default constructor found", ex);
|
throw new BeanInstantiationException(clazz, "No default constructor found", ex);
|
||||||
}
|
}
|
||||||
|
catch (LinkageError err) {
|
||||||
|
throw new BeanInstantiationException(clazz, "Unresolvable class definition", err);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|||||||
@@ -1379,8 +1379,8 @@ public abstract class AbstractBeanFactory extends FactoryBeanRegistrySupport imp
|
|||||||
catch (ClassNotFoundException ex) {
|
catch (ClassNotFoundException ex) {
|
||||||
throw new CannotLoadBeanClassException(mbd.getResourceDescription(), beanName, mbd.getBeanClassName(), ex);
|
throw new CannotLoadBeanClassException(mbd.getResourceDescription(), beanName, mbd.getBeanClassName(), ex);
|
||||||
}
|
}
|
||||||
catch (LinkageError ex) {
|
catch (LinkageError err) {
|
||||||
throw new CannotLoadBeanClassException(mbd.getResourceDescription(), beanName, mbd.getBeanClassName(), ex);
|
throw new CannotLoadBeanClassException(mbd.getResourceDescription(), beanName, mbd.getBeanClassName(), err);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* Copyright 2002-2017 the original author or authors.
|
* Copyright 2002-2018 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.
|
||||||
@@ -137,12 +137,12 @@ public class DefaultNamespaceHandlerResolver implements NamespaceHandlerResolver
|
|||||||
return namespaceHandler;
|
return namespaceHandler;
|
||||||
}
|
}
|
||||||
catch (ClassNotFoundException ex) {
|
catch (ClassNotFoundException ex) {
|
||||||
throw new FatalBeanException("NamespaceHandler class [" + className + "] for namespace [" +
|
throw new FatalBeanException("Could not find NamespaceHandler class [" + className +
|
||||||
namespaceUri + "] not found", ex);
|
"] for namespace [" + namespaceUri + "]", ex);
|
||||||
}
|
}
|
||||||
catch (LinkageError err) {
|
catch (LinkageError err) {
|
||||||
throw new FatalBeanException("Invalid NamespaceHandler class [" + className + "] for namespace [" +
|
throw new FatalBeanException("Unresolvable class definition for NamespaceHandler class [" +
|
||||||
namespaceUri + "]: problem with handler class file or dependent class", err);
|
className + "] for namespace [" + namespaceUri + "]", err);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -298,11 +298,10 @@ public abstract class ClassUtils {
|
|||||||
return forName(className, classLoader);
|
return forName(className, classLoader);
|
||||||
}
|
}
|
||||||
catch (ClassNotFoundException ex) {
|
catch (ClassNotFoundException ex) {
|
||||||
throw new IllegalArgumentException("Cannot find class [" + className + "]", ex);
|
throw new IllegalArgumentException("Could not find class [" + className + "]", ex);
|
||||||
}
|
}
|
||||||
catch (LinkageError ex) {
|
catch (LinkageError err) {
|
||||||
throw new IllegalArgumentException(
|
throw new IllegalArgumentException("Unresolvable class definition for class [" + className + "]", err);
|
||||||
"Error loading class [" + className + "]: problem with class file or dependent class.", ex);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* Copyright 2002-2017 the original author or authors.
|
* Copyright 2002-2018 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.
|
||||||
@@ -355,11 +355,8 @@ public class WebFluxConfigurationSupport implements ApplicationContextAware {
|
|||||||
String name = "org.springframework.validation.beanvalidation.OptionalValidatorFactoryBean";
|
String name = "org.springframework.validation.beanvalidation.OptionalValidatorFactoryBean";
|
||||||
clazz = ClassUtils.forName(name, getClass().getClassLoader());
|
clazz = ClassUtils.forName(name, getClass().getClassLoader());
|
||||||
}
|
}
|
||||||
catch (ClassNotFoundException ex) {
|
catch (ClassNotFoundException | LinkageError ex) {
|
||||||
throw new BeanInitializationException("Could not find default validator class", ex);
|
throw new BeanInitializationException("Failed to resolve default validator class", ex);
|
||||||
}
|
|
||||||
catch (LinkageError ex) {
|
|
||||||
throw new BeanInitializationException("Could not load default validator class", ex);
|
|
||||||
}
|
}
|
||||||
validator = (Validator) BeanUtils.instantiateClass(clazz);
|
validator = (Validator) BeanUtils.instantiateClass(clazz);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* Copyright 2002-2017 the original author or authors.
|
* Copyright 2002-2018 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.
|
||||||
@@ -850,12 +850,12 @@ public class DispatcherServlet extends FrameworkServlet {
|
|||||||
catch (ClassNotFoundException ex) {
|
catch (ClassNotFoundException ex) {
|
||||||
throw new BeanInitializationException(
|
throw new BeanInitializationException(
|
||||||
"Could not find DispatcherServlet's default strategy class [" + className +
|
"Could not find DispatcherServlet's default strategy class [" + className +
|
||||||
"] for interface [" + key + "]", ex);
|
"] for interface [" + key + "]", ex);
|
||||||
}
|
}
|
||||||
catch (LinkageError err) {
|
catch (LinkageError err) {
|
||||||
throw new BeanInitializationException(
|
throw new BeanInitializationException(
|
||||||
"Error loading DispatcherServlet's default strategy class [" + className +
|
"Unresolvable class definition for DispatcherServlet's default strategy class [" +
|
||||||
"] for interface [" + key + "]: problem with class file or dependent class", err);
|
className + "] for interface [" + key + "]", err);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return strategies;
|
return strategies;
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* Copyright 2002-2017 the original author or authors.
|
* Copyright 2002-2018 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.
|
||||||
@@ -662,7 +662,7 @@ public class WebMvcConfigurationSupport implements ApplicationContextAware, Serv
|
|||||||
clazz = ClassUtils.forName(className, WebMvcConfigurationSupport.class.getClassLoader());
|
clazz = ClassUtils.forName(className, WebMvcConfigurationSupport.class.getClassLoader());
|
||||||
}
|
}
|
||||||
catch (ClassNotFoundException | LinkageError ex) {
|
catch (ClassNotFoundException | LinkageError ex) {
|
||||||
throw new BeanInitializationException("Could not find default validator class", ex);
|
throw new BeanInitializationException("Failed to resolve default validator class", ex);
|
||||||
}
|
}
|
||||||
validator = (Validator) BeanUtils.instantiateClass(clazz);
|
validator = (Validator) BeanUtils.instantiateClass(clazz);
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user