Skip to content

Commit c5eba23

Browse files
committed
HHH-18982 throw instead of log when BeanManager not on classpath
1 parent 9a04065 commit c5eba23

14 files changed

+101
-86
lines changed

hibernate-core/src/main/java/org/hibernate/boot/internal/TypeBeanInstanceProducer.java

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -7,14 +7,15 @@
77
import org.hibernate.InstantiationException;
88
import org.hibernate.Internal;
99
import org.hibernate.engine.config.spi.ConfigurationService;
10-
import org.hibernate.internal.util.ReflectHelper;
1110
import org.hibernate.resource.beans.spi.BeanInstanceProducer;
1211
import org.hibernate.type.spi.TypeBootstrapContext;
1312
import org.hibernate.service.ServiceRegistry;
1413

1514
import java.lang.reflect.Constructor;
1615
import java.util.Map;
1716

17+
import static org.hibernate.internal.util.ReflectHelper.getConstructorOrNull;
18+
1819
/**
1920
* {@link BeanInstanceProducer} implementation for building beans related to custom types.
2021
*
@@ -32,8 +33,8 @@ public TypeBeanInstanceProducer(ConfigurationService configurationService, Servi
3233

3334
@Override
3435
public <B> B produceBeanInstance(Class<B> beanType) {
35-
final Constructor<B> bootstrapContextAwareConstructor =
36-
ReflectHelper.getConstructorOrNull( beanType, TypeBootstrapContext.class );
36+
final Constructor<? extends B> bootstrapContextAwareConstructor =
37+
getConstructorOrNull( beanType, TypeBootstrapContext.class );
3738
if ( bootstrapContextAwareConstructor != null ) {
3839
try {
3940
return bootstrapContextAwareConstructor.newInstance( this );
@@ -43,7 +44,7 @@ public <B> B produceBeanInstance(Class<B> beanType) {
4344
}
4445
}
4546
else {
46-
final Constructor<B> constructor = ReflectHelper.getConstructorOrNull( beanType );
47+
final Constructor<? extends B> constructor = getConstructorOrNull( beanType );
4748
if ( constructor != null ) {
4849
try {
4950
return constructor.newInstance();

hibernate-core/src/main/java/org/hibernate/boot/model/internal/GeneratorBinder.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -476,11 +476,11 @@ private static Generator instantiateGenerator(
476476
* @param beanContainer an optional {@code BeanContainer}
477477
* @param generatorClass a class which implements {@code Generator}
478478
*/
479-
private static Generator instantiateGeneratorAsBean(
479+
private static <T extends Generator> Generator instantiateGeneratorAsBean(
480480
Annotation annotation,
481481
BeanContainer beanContainer,
482482
GeneratorCreationContext creationContext,
483-
Class<? extends Generator> generatorClass,
483+
Class<T> generatorClass,
484484
MemberDetails memberDetails,
485485
Class<? extends Annotation> annotationType) {
486486
return Helper.getBean(

hibernate-core/src/main/java/org/hibernate/engine/jdbc/connections/internal/ConnectionProviderInitiator.java

Lines changed: 17 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -105,7 +105,7 @@ public ConnectionProvider initiateService(
105105
}
106106
else if ( explicitSetting instanceof Class<?> providerClass ) {
107107
LOG.instantiatingExplicitConnectionProvider( providerClass.getName() );
108-
return instantiateExplicitConnectionProvider( providerClass, beanContainer );
108+
return instantiateExplicitConnectionProvider( connectionProviderClass( providerClass ), beanContainer );
109109
}
110110
else {
111111
final String providerName = nullIfBlank( explicitSetting.toString() );
@@ -118,10 +118,21 @@ else if ( explicitSetting instanceof Class<?> providerClass ) {
118118
return instantiateConnectionProvider( configurationValues, strategySelector, beanContainer );
119119
}
120120

121+
private static Class<? extends ConnectionProvider> connectionProviderClass(Class<?> providerClass) {
122+
if ( !ConnectionProvider.class.isAssignableFrom( providerClass ) ) {
123+
throw new ConnectionProviderConfigurationException( "Class '" + providerClass.getName()
124+
+ "' does not implement 'ConnectionProvider'" );
125+
}
126+
@SuppressWarnings("unchecked")
127+
final Class<? extends ConnectionProvider> connectionProviderClass =
128+
(Class<? extends ConnectionProvider>) providerClass;
129+
return connectionProviderClass;
130+
}
131+
121132
private ConnectionProvider instantiateNamedConnectionProvider(
122133
String providerName, StrategySelector strategySelector, BeanContainer beanContainer) {
123134
LOG.instantiatingExplicitConnectionProvider( providerName );
124-
final Class<?> providerClass =
135+
final Class<? extends ConnectionProvider> providerClass =
125136
strategySelector.selectStrategyImplementor( ConnectionProvider.class, providerName );
126137
try {
127138
return instantiateExplicitConnectionProvider( providerClass, beanContainer );
@@ -192,7 +203,8 @@ private Class<? extends ConnectionProvider> getSingleRegisteredProvider(Strategy
192203
: null;
193204
}
194205

195-
private ConnectionProvider instantiateExplicitConnectionProvider(Class<?> providerClass, BeanContainer beanContainer) {
206+
private <T extends ConnectionProvider> T instantiateExplicitConnectionProvider(
207+
Class<T> providerClass, BeanContainer beanContainer) {
196208
try {
197209
if ( beanContainer != null ) {
198210
return Helper.getBean(
@@ -202,7 +214,7 @@ private ConnectionProvider instantiateExplicitConnectionProvider(Class<?> provid
202214
true,
203215
() -> {
204216
try {
205-
return (ConnectionProvider) providerClass.getConstructor().newInstance();
217+
return providerClass.getConstructor().newInstance();
206218
}
207219
catch (Exception e) {
208220
throw new HibernateException( "Could not instantiate connection provider [" + providerClass.getName() + "]", e );
@@ -211,7 +223,7 @@ private ConnectionProvider instantiateExplicitConnectionProvider(Class<?> provid
211223
);
212224
}
213225
else {
214-
return (ConnectionProvider) providerClass.getConstructor().newInstance();
226+
return providerClass.getConstructor().newInstance();
215227
}
216228
}
217229
catch (Exception e) {

hibernate-core/src/main/java/org/hibernate/resource/beans/container/internal/CdiBeanContainerBuilder.java

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,13 +6,14 @@
66

77
import jakarta.enterprise.inject.spi.BeanManager;
88
import org.hibernate.AssertionFailure;
9-
import org.hibernate.cfg.AvailableSettings;
109
import org.hibernate.engine.config.spi.ConfigurationService;
1110
import org.hibernate.engine.config.spi.StandardConverters;
1211
import org.hibernate.resource.beans.container.spi.BeanContainer;
1312
import org.hibernate.resource.beans.container.spi.ExtendedBeanManager;
1413
import org.hibernate.service.ServiceRegistry;
1514

15+
import static org.hibernate.cfg.ManagedBeanSettings.DELAY_CDI_ACCESS;
16+
1617
/**
1718
* Helper class for building a CDI-based {@link BeanContainer}.
1819
*
@@ -36,6 +37,6 @@ else if ( beanManager instanceof BeanManager cdiBeanManager ) {
3637

3738
private static boolean delayCdiAccess(ServiceRegistry serviceRegistry) {
3839
return serviceRegistry.requireService( ConfigurationService.class )
39-
.getSetting( AvailableSettings.DELAY_CDI_ACCESS, StandardConverters.BOOLEAN, false );
40+
.getSetting( DELAY_CDI_ACCESS, StandardConverters.BOOLEAN, false );
4041
}
4142
}

hibernate-core/src/main/java/org/hibernate/resource/beans/container/internal/CdiBeanContainerExtendedAccessImpl.java

Lines changed: 3 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,6 @@
55
package org.hibernate.resource.beans.container.internal;
66

77
import jakarta.enterprise.inject.spi.BeanManager;
8-
98
import org.hibernate.Internal;
109
import org.hibernate.resource.beans.container.spi.AbstractCdiBeanContainer;
1110
import org.hibernate.resource.beans.container.spi.BeanLifecycleStrategy;
@@ -14,7 +13,7 @@
1413
import org.hibernate.resource.beans.container.spi.ExtendedBeanManager;
1514
import org.hibernate.resource.beans.spi.BeanInstanceProducer;
1615

17-
import org.jboss.logging.Logger;
16+
import static org.hibernate.resource.beans.internal.BeansMessageLogger.BEANS_MSG_LOGGER;
1817

1918
/**
2019
* @author Steve Ebersole
@@ -23,15 +22,13 @@ public class CdiBeanContainerExtendedAccessImpl
2322
extends AbstractCdiBeanContainer
2423
implements ExtendedBeanManager.LifecycleListener {
2524

26-
// NOTE : we continue to use the deprecated form for now since that is what WildFly needs for the time being still
27-
28-
private static final Logger log = Logger.getLogger( CdiBeanContainerExtendedAccessImpl.class );
25+
// NOTE : we continue to use the deprecated form for now since that is what WildFly needs for the time being
2926

3027
private BeanManager usableBeanManager;
3128

3229
CdiBeanContainerExtendedAccessImpl(ExtendedBeanManager beanManager) {
3330
beanManager.registerLifecycleListener( this );
34-
log.debugf( "Extended access requested to CDI BeanManager : %s", beanManager );
31+
BEANS_MSG_LOGGER.extendedAccessToBeanManager();
3532
}
3633

3734
@Override

hibernate-core/src/main/java/org/hibernate/resource/beans/container/internal/CdiBeanContainerImmediateAccessImpl.java

Lines changed: 6 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -5,24 +5,22 @@
55
package org.hibernate.resource.beans.container.internal;
66

77
import jakarta.enterprise.inject.spi.BeanManager;
8-
98
import org.hibernate.resource.beans.container.spi.AbstractCdiBeanContainer;
109
import org.hibernate.resource.beans.container.spi.BeanLifecycleStrategy;
1110
import org.hibernate.resource.beans.container.spi.ContainedBeanImplementor;
1211
import org.hibernate.resource.beans.spi.BeanInstanceProducer;
1312

14-
import org.jboss.logging.Logger;
13+
import static org.hibernate.resource.beans.internal.BeansMessageLogger.BEANS_MSG_LOGGER;
1514

1615
/**
1716
* @author Steve Ebersole
1817
*/
1918
public class CdiBeanContainerImmediateAccessImpl extends AbstractCdiBeanContainer {
20-
private static final Logger log = Logger.getLogger( CdiBeanContainerImmediateAccessImpl.class );
2119

2220
private final BeanManager beanManager;
2321

2422
CdiBeanContainerImmediateAccessImpl(BeanManager beanManager) {
25-
log.debugf( "Standard access requested to CDI BeanManager : %s", beanManager );
23+
BEANS_MSG_LOGGER.standardAccessToBeanManager();
2624
this.beanManager = beanManager;
2725
}
2826

@@ -36,7 +34,8 @@ protected <B> ContainedBeanImplementor<B> createBean(
3634
Class<B> beanType,
3735
BeanLifecycleStrategy lifecycleStrategy,
3836
BeanInstanceProducer fallbackProducer) {
39-
final ContainedBeanImplementor<B> bean = lifecycleStrategy.createBean( beanType, fallbackProducer, this );
37+
final ContainedBeanImplementor<B> bean =
38+
lifecycleStrategy.createBean( beanType, fallbackProducer, this );
4039
bean.initialize();
4140
return bean;
4241
}
@@ -47,12 +46,8 @@ protected <B> ContainedBeanImplementor<B> createBean(
4746
Class<B> beanType,
4847
BeanLifecycleStrategy lifecycleStrategy,
4948
BeanInstanceProducer fallbackProducer) {
50-
final ContainedBeanImplementor<B> bean = lifecycleStrategy.createBean(
51-
name,
52-
beanType,
53-
fallbackProducer,
54-
this
55-
);
49+
final ContainedBeanImplementor<B> bean =
50+
lifecycleStrategy.createBean( name, beanType, fallbackProducer, this );
5651
bean.initialize();
5752
return bean;
5853
}

hibernate-core/src/main/java/org/hibernate/resource/beans/container/internal/ContainerManagedLifecycleStrategy.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -199,7 +199,7 @@ protected Instance<B> resolveContainerInstance() {
199199
return root.select( beanType, new NamedBeanQualifier( beanName ) );
200200
}
201201
catch (Exception e) {
202-
throw new NoSuchBeanException( "Bean class not known to CDI : " + beanType.getName(), e );
202+
throw new NoSuchBeanException( "Bean class not known to CDI: " + beanType.getName(), e );
203203
}
204204
}
205205

hibernate-core/src/main/java/org/hibernate/resource/beans/container/internal/JpaCompliantLifecycleStrategy.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -141,8 +141,8 @@ public void initialize() {
141141
beanInstance = fallbackProducer.produceBeanInstance( beanType );
142142

143143
try {
144-
if ( this.creationalContext != null ) {
145-
this.creationalContext.release();
144+
if ( creationalContext != null ) {
145+
creationalContext.release();
146146
}
147147
}
148148
catch (Exception ignore) {

hibernate-core/src/main/java/org/hibernate/resource/beans/container/spi/AbstractCdiBeanContainer.java

Lines changed: 10 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -13,10 +13,11 @@
1313
import org.hibernate.resource.beans.container.internal.CdiBasedBeanContainer;
1414
import org.hibernate.resource.beans.container.internal.ContainerManagedLifecycleStrategy;
1515
import org.hibernate.resource.beans.container.internal.JpaCompliantLifecycleStrategy;
16-
import org.hibernate.resource.beans.internal.BeansMessageLogger;
1716
import org.hibernate.resource.beans.internal.Helper;
1817
import org.hibernate.resource.beans.spi.BeanInstanceProducer;
1918

19+
import static org.hibernate.resource.beans.internal.BeansMessageLogger.BEANS_MSG_LOGGER;
20+
2021
/**
2122
* @author Steve Ebersole
2223
*/
@@ -34,7 +35,6 @@ public <B> ContainedBean<B> getBean(
3435
: createBean( beanType, lifecycleOptions, fallbackProducer );
3536
}
3637

37-
@SuppressWarnings("unchecked")
3838
private <B> ContainedBean<B> getCacheableBean(
3939
Class<B> beanType,
4040
LifecycleOptions lifecycleOptions,
@@ -43,6 +43,7 @@ private <B> ContainedBean<B> getCacheableBean(
4343

4444
final ContainedBeanImplementor<?> existing = beanCache.get( beanCacheKey );
4545
if ( existing != null ) {
46+
//noinspection unchecked
4647
return (ContainedBeanImplementor<B>) existing;
4748
}
4849

@@ -77,15 +78,11 @@ public <B> ContainedBean<B> getBean(
7778
Class<B> beanType,
7879
LifecycleOptions lifecycleOptions,
7980
BeanInstanceProducer fallbackProducer) {
80-
if ( lifecycleOptions.canUseCachedReferences() ) {
81-
return getCacheableBean( beanName, beanType, lifecycleOptions, fallbackProducer );
82-
}
83-
else {
84-
return createBean( beanName, beanType, lifecycleOptions, fallbackProducer );
85-
}
81+
return lifecycleOptions.canUseCachedReferences()
82+
? getCacheableBean( beanName, beanType, lifecycleOptions, fallbackProducer )
83+
: createBean( beanName, beanType, lifecycleOptions, fallbackProducer );
8684
}
8785

88-
@SuppressWarnings("unchecked")
8986
private <B> ContainedBeanImplementor<B> getCacheableBean(
9087
String beanName,
9188
Class<B> beanType,
@@ -95,10 +92,12 @@ private <B> ContainedBeanImplementor<B> getCacheableBean(
9592

9693
final ContainedBeanImplementor<?> existing = beanCache.get( beanCacheKey );
9794
if ( existing != null ) {
95+
//noinspection unchecked
9896
return (ContainedBeanImplementor<B>) existing;
9997
}
10098

101-
final ContainedBeanImplementor<B> bean = createBean( beanName, beanType, lifecycleOptions, fallbackProducer );
99+
final ContainedBeanImplementor<B> bean =
100+
createBean( beanName, beanType, lifecycleOptions, fallbackProducer );
102101
beanCache.put( beanCacheKey, bean );
103102
return bean;
104103
}
@@ -133,7 +132,7 @@ protected final void forEachBean(Consumer<ContainedBeanImplementor<?>> consumer)
133132

134133
@Override
135134
public final void stop() {
136-
BeansMessageLogger.BEANS_MSG_LOGGER.stoppingBeanContainer( this );
135+
BEANS_MSG_LOGGER.stoppingBeanContainer( this );
137136
forEachBean( ContainedBeanImplementor::release );
138137
registeredBeans.clear();
139138
beanCache.clear();

hibernate-core/src/main/java/org/hibernate/resource/beans/internal/BeansMessageLogger.java

Lines changed: 15 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,6 @@
1717

1818
import static org.jboss.logging.Logger.Level.DEBUG;
1919
import static org.jboss.logging.Logger.Level.INFO;
20-
import static org.jboss.logging.Logger.Level.WARN;
2120

2221
/**
2322
* @author Steve Ebersole
@@ -33,20 +32,11 @@ public interface BeansMessageLogger {
3332

3433
BeansMessageLogger BEANS_MSG_LOGGER = Logger.getMessageLogger( MethodHandles.lookup(), BeansMessageLogger.class, LOGGER_NAME );
3534

36-
@LogMessage( level = WARN )
37-
@Message(
38-
id = 10005001,
39-
value = "An explicit CDI BeanManager reference [%s] was passed to Hibernate, " +
40-
"but CDI is not available on the Hibernate ClassLoader. This is likely " +
41-
"going to lead to exceptions later on in bootstrap."
42-
)
43-
void beanManagerButCdiNotAvailable(Object cdiBeanManagerReference);
44-
4535
@LogMessage( level = INFO )
4636
@Message(
4737
id = 10005002,
4838
value = "No explicit CDI BeanManager reference was passed to Hibernate, " +
49-
"but CDI is available on the Hibernate ClassLoader."
39+
"but CDI is available on the Hibernate class loader"
5040
)
5141
void noBeanManagerButCdiAvailable();
5242

@@ -56,4 +46,18 @@ public interface BeansMessageLogger {
5646
value = "Stopping BeanContainer: %s"
5747
)
5848
void stoppingBeanContainer(BeanContainer beanContainer);
49+
50+
@LogMessage( level = DEBUG )
51+
@Message(
52+
id = 10005006,
53+
value = "Standard access to BeanManager"
54+
)
55+
void standardAccessToBeanManager();
56+
57+
@LogMessage( level = DEBUG )
58+
@Message(
59+
id = 10005007,
60+
value = "Extended access to BeanManager"
61+
)
62+
void extendedAccessToBeanManager();
5963
}

hibernate-core/src/main/java/org/hibernate/resource/beans/internal/FallbackBeanInstanceProducer.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -36,7 +36,7 @@ private FallbackBeanInstanceProducer() {
3636
public <B> B produceBeanInstance(Class<B> beanType) {
3737
log.tracef( "Creating ManagedBean(%s) using direct instantiation", beanType.getName() );
3838
try {
39-
Constructor<B> constructor = beanType.getDeclaredConstructor();
39+
final Constructor<B> constructor = beanType.getDeclaredConstructor();
4040
constructor.setAccessible( true );
4141
return constructor.newInstance();
4242
}

0 commit comments

Comments
 (0)