/** * Register {@link DatastoreResolver} annotated beans as <code>datastore</code> {@link ExpressionResolver}s. * @param datastore Datastore to configure * @param datastoreBeanName Datastore bean name to configure * @param beanFactory Bean factory */ private static void configureDatastoreResolvers(Datastore datastore, String datastoreBeanName, ListableBeanFactory beanFactory) { final String[] beanNames = beanFactory.getBeanNamesForAnnotation(DatastoreResolver.class); if (beanNames != null && beanNames.length > 0) { for (String beanName : beanNames) { if (!ExpressionResolver.class.isAssignableFrom(beanFactory.getType(beanName))) { throw new BeanNotOfRequiredTypeException(beanName, ExpressionResolver.class, beanFactory.getType(beanName)); } DatastoreResolver dr = beanFactory.findAnnotationOnBean(beanName, DatastoreResolver.class); String datastoreRef = AnnotationUtils.getStringValue(dr.datastoreBeanName()); if (datastoreRef == null || datastoreRef.equals(datastoreBeanName)) { // register resolver ExpressionResolver<?, ?> resolver = (ExpressionResolver<?, ?>) beanFactory.getBean(beanName); datastore.addExpressionResolver(resolver); LOGGER.debug(() -> "Registered expression resolver [" + resolver.getClass().getName() + "] into Datastore with bean name [" + datastoreBeanName + "]"); } } } }
@PostConstruct public void init() { if (!configuration.isInitialize()) { LOGGER.debug(() -> "Initialization disabled (not running DDL scripts) for data context id: [" + getDataContextId().orElse("DEFAULT") + "]"); return; } DataSource dataSource = null; try { dataSource = applicationContext.getBean(dataSourceBeanName, DataSource.class); } catch (@SuppressWarnings("unused") NoSuchBeanDefinitionException | BeanNotOfRequiredTypeException e) { // ignore } if (dataSource == null) { LOGGER.debug(() -> "No DataSource found using bean name " + dataSourceBeanName + ": skip initialization"); return; } runSchemaScripts(dataSource); }
public Object getTarget() throws BeansException { Object localTarget = target.get(); if (localTarget == null) { // verify if declared service interface is compatible with the real bean type Class<?> beanClass = beanFactory.getType(beanName); if (!serviceInterface.isAssignableFrom(beanClass)) { throw new BeanNotOfRequiredTypeException(beanName, serviceInterface, beanClass); } if (target.compareAndSet(null, localTarget = beanFactory.getBean(beanName))) { return localTarget; } else { log.debug("Redundant initialization of ExportTargetSource for bean '{}' caused by" + "concurrency has been detected.", beanName); return target.get(); } } return localTarget; }
public Object getTarget() throws BeansException { Object localTarget = target.get(); if (localTarget == null) { if (!rootContext.containsBean(exportProxyName)) { throw new NoSuchBeanDefinitionException(exportProxyName, String.format( "can't find export declaration for lookup(%s, %s)", serviceName, serviceInterface)); } ExportTargetSource exportProxy = rootContext.getBean(exportProxyName, ExportTargetSource.class); // verify if service interfaces on both sides are compatible if (!serviceInterface.isAssignableFrom(exportProxy.getTargetClass())) { throw new BeanNotOfRequiredTypeException(serviceName, serviceInterface, exportProxy.getTargetClass()); } if (target.compareAndSet(null, localTarget = exportProxy.getTarget())) { return localTarget; } else { // log potentially redundant instance initialization log.warn("Bean {} was created earlier", serviceName); return target.get(); } } return localTarget; }
@Override @SuppressWarnings("unchecked") public <T> T getBean(String name, Class<T> requiredType) throws BeansException { Object bean = getBean(name); if (requiredType != null && !requiredType.isAssignableFrom(bean.getClass())) { throw new BeanNotOfRequiredTypeException(name, requiredType, bean.getClass()); } return (T) bean; }
/** * Register {@link com.holonplatform.spring.DatastoreCommodityFactory} annotated beans as <code>datastore</code> * {@link DatastoreCommodityFactory}s. * @param datastore Datastore to configure * @param datastoreBeanName Datastore bean name to configure * @param beanFactory Bean factory */ @SuppressWarnings({ "unchecked", "rawtypes" }) private static void configureDatastoreCommodityFactories(Datastore datastore, String datastoreBeanName, ListableBeanFactory beanFactory) { if (datastore instanceof DatastoreCommodityRegistrar) { final Class<? extends DatastoreCommodityFactory> baseType = ((DatastoreCommodityRegistrar<?>) datastore) .getCommodityFactoryType(); if (baseType != null) { final String[] beanNames = beanFactory .getBeanNamesForAnnotation(com.holonplatform.spring.DatastoreCommodityFactory.class); if (beanNames != null && beanNames.length > 0) { for (String beanName : beanNames) { com.holonplatform.spring.DatastoreCommodityFactory dr = beanFactory.findAnnotationOnBean( beanName, com.holonplatform.spring.DatastoreCommodityFactory.class); String datastoreRef = AnnotationUtils.getStringValue(dr.datastoreBeanName()); if (datastoreRef == null || datastoreRef.equals(datastoreBeanName)) { if (!baseType.isAssignableFrom(beanFactory.getType(beanName))) { throw new BeanNotOfRequiredTypeException(beanName, baseType, beanFactory.getType(beanName)); } // register resolver DatastoreCommodityFactory datastoreCommodityFactory = (DatastoreCommodityFactory) beanFactory .getBean(beanName); ((DatastoreCommodityRegistrar) datastore).registerCommodity(datastoreCommodityFactory); LOGGER.debug(() -> "Registered factory [" + datastoreCommodityFactory.getClass().getName() + "] into Datastore with bean name [" + datastoreBeanName + "]"); } } } } else { LOGGER.debug( () -> "Datastore [" + datastore + "] does not declares a DatastoreCommodityFactory base type: " + "skipping DatastoreCommodityFactory beans configuration"); } } else { LOGGER.debug(() -> "Datastore [" + datastore + "] is not a DatastoreCommodityRegistrar: skipping DatastoreCommodityFactory beans configuration"); } }
@Test public void testLookupWhereBeanFactoryYieldsNonDataSourceType() throws Exception { final BeanFactory beanFactory = mock(BeanFactory.class); given(beanFactory.getBean(DATASOURCE_BEAN_NAME, DataSource.class)).willThrow( new BeanNotOfRequiredTypeException(DATASOURCE_BEAN_NAME, DataSource.class, String.class)); try { BeanFactoryDataSourceLookup lookup = new BeanFactoryDataSourceLookup(beanFactory); lookup.getDataSource(DATASOURCE_BEAN_NAME); fail("should have thrown DataSourceLookupFailureException"); } catch (DataSourceLookupFailureException ex) { /* expected */ } }
@Test public void getInstanceByNonmatchingClass() { try { getBeanFactory().getBean("rod", BeanFactory.class); fail("Rod bean is not of type BeanFactory; getBeanInstance(rod, BeanFactory.class) should throw BeanNotOfRequiredTypeException"); } catch (BeanNotOfRequiredTypeException ex) { // So far, so good assertTrue("Exception has correct bean name", ex.getBeanName().equals("rod")); assertTrue("Exception requiredType must be BeanFactory.class", ex.getRequiredType().equals(BeanFactory.class)); assertTrue("Exception actualType as TestBean.class", TestBean.class.isAssignableFrom(ex.getActualType())); assertTrue("Actual type is correct", ex.getActualType() == getBeanFactory().getBean("rod").getClass()); } }
@Test public void getSharedInstanceByNonmatchingClass() { try { getBeanFactory().getBean("rod", BeanFactory.class); fail("Rod bean is not of type BeanFactory; getBeanInstance(rod, BeanFactory.class) should throw BeanNotOfRequiredTypeException"); } catch (BeanNotOfRequiredTypeException ex) { // So far, so good assertTrue("Exception has correct bean name", ex.getBeanName().equals("rod")); assertTrue("Exception requiredType must be BeanFactory.class", ex.getRequiredType().equals(BeanFactory.class)); assertTrue("Exception actualType as TestBean.class", TestBean.class.isAssignableFrom(ex.getActualType())); } }
@Override protected FailureAnalysis analyze(Throwable rootFailure, BeanNotOfRequiredTypeException cause) { if (!Proxy.isProxyClass(cause.getActualType())) { return null; } return new FailureAnalysis(getDescription(cause), ACTION, cause); }
private String getDescription(BeanNotOfRequiredTypeException ex) { StringWriter description = new StringWriter(); PrintWriter printer = new PrintWriter(description); printer.printf( "The bean '%s' could not be injected as a '%s' because it is a " + "JDK dynamic proxy that implements:%n", ex.getBeanName(), ex.getRequiredType().getName()); for (Class<?> iface : ex.getRequiredType().getInterfaces()) { printer.println("\t" + iface.getName()); } return description.toString(); }
@Test(expected = BeanNotOfRequiredTypeException.class) public void shouldFailToSubscribeOnBeanIncorrectType() { // when Single result = service.invalidSchedulerType(); // then assertNotNull(result); }
@Test(expected = BeanNotOfRequiredTypeException.class) public void shouldFailToSubscribeOnBeanIncorrectType() { // when Observable result = service.invalidSchedulerType(); // then assertNotNull(result); }
@SuppressWarnings("unchecked") public <T> T getBean(String name, Class<T> requiredType) throws BeansException { Object bean = getBean(name); if (requiredType != null && !requiredType.isAssignableFrom(bean.getClass())) { throw new BeanNotOfRequiredTypeException(name, requiredType, bean.getClass()); } return (T) bean; }
/** * Test method for {@link BeanFactoryViewDescriptorRegistry#getViewDescriptor(java.lang.String)}. */ public final void testGetViewDescriptor() { BeanFactoryViewDescriptorRegistry registry = new BeanFactoryViewDescriptorRegistry(); StaticApplicationContext appCtx = new StaticApplicationContext(); registry.setApplicationContext(appCtx); MutablePropertyValues mpv = new MutablePropertyValues(); mpv.addPropertyValue("viewClass", NullView.class); appCtx.registerSingleton("view1", DefaultViewDescriptor.class, mpv); appCtx.registerSingleton("view2", DefaultViewDescriptor.class, mpv); appCtx.registerSingleton("bogusView", String.class); Assert.assertNotNull(registry.getViewDescriptor("view1")); Assert.assertNotNull(registry.getViewDescriptor("view2")); Assert.assertNull("Should return null when viewName not found", registry.getViewDescriptor("bogus")); try { registry.getViewDescriptor("bogusView"); Assert.fail("Should have thrown BeanNotOfRequiredTypeException"); } catch (BeanNotOfRequiredTypeException e) { //do nothing, test succeeded } }