/** * Define a Spring namespace definition to use. * @param definition the namespace definition */ public void xmlns(Map<String, String> definition) { if (!definition.isEmpty()) { for (Map.Entry<String,String> entry : definition.entrySet()) { String namespace = entry.getKey(); String uri = entry.getValue(); if (uri == null) { throw new IllegalArgumentException("Namespace definition must supply a non-null URI"); } NamespaceHandler namespaceHandler = this.xmlBeanDefinitionReader.getNamespaceHandlerResolver().resolve(uri); if (namespaceHandler == null) { throw new BeanDefinitionParsingException(new Problem("No namespace handler found for URI: " + uri, new Location(new DescriptiveResource(("Groovy"))))); } this.namespaces.put(namespace, uri); } } }
@Test public void configurationClassesMayNotBeFinal() { @Configuration final class Config { } BeanDefinition configBeanDef = rootBeanDefinition(Config.class).getBeanDefinition(); DefaultListableBeanFactory beanFactory = new DefaultListableBeanFactory(); beanFactory.registerBeanDefinition("config", configBeanDef); try { ConfigurationClassPostProcessor pp = new ConfigurationClassPostProcessor(); pp.postProcessBeanFactory(beanFactory); fail("expected exception"); } catch (BeanDefinitionParsingException ex) { assertTrue(ex.getMessage(), ex.getMessage().contains("Remove the final modifier")); } }
/** * Define a Spring XML namespace definition to use. * @param definition the namespace definition */ public void xmlns(Map<String, String> definition) { if (!definition.isEmpty()) { for (Map.Entry<String,String> entry : definition.entrySet()) { String namespace = entry.getKey(); String uri = entry.getValue(); if (uri == null) { throw new IllegalArgumentException("Namespace definition must supply a non-null URI"); } NamespaceHandler namespaceHandler = this.groovyDslXmlBeanDefinitionReader.getNamespaceHandlerResolver().resolve( uri); if (namespaceHandler == null) { throw new BeanDefinitionParsingException(new Problem("No namespace handler found for URI: " + uri, new Location(new DescriptiveResource(("Groovy"))))); } this.namespaces.put(namespace, uri); } } }
/** * Define a Spring XML namespace definition to use. * @param definition the namespace definition */ public void xmlns(Map<String, String> definition) { if (!definition.isEmpty()) { for (Map.Entry<String,String> entry : definition.entrySet()) { String namespace = entry.getKey(); String uri = entry.getValue(); if (uri == null) { throw new IllegalArgumentException("Namespace definition must supply a non-null URI"); } NamespaceHandler namespaceHandler = this.groovyDslXmlBeanDefinitionReader.getNamespaceHandlerResolver().resolve(uri); if (namespaceHandler == null) { throw new BeanDefinitionParsingException(new Problem("No namespace handler found for URI: " + uri, new Location(new DescriptiveResource(("Groovy"))))); } this.namespaces.put(namespace, uri); } } }
/** * @param element * @param parserContext * @return * @see org.springframework.beans.factory.xml.AbstractBeanDefinitionParser#parseInternal(org.w3c.dom.Element, * org.springframework.beans.factory.xml.ParserContext) */ @Override protected AbstractBeanDefinition parseInternal(final Element element, final ParserContext parserContext) { final BeanDefinitionBuilder factory = parsePFixture(element); final List<Element> childElements = DomUtils.getChildElementsByTagName(element, CoreSchemaConstants.ELEMENT_LOCATION); // Must have at least one element if (childElements == null || childElements.isEmpty()) { throw new BeanDefinitionParsingException( new Problem( "Portable test fixture manager must be wired with at least one context location", new Location(parserContext.getReaderContext().getResource()))); } parseChildLocations(childElements, factory); return factory.getBeanDefinition(); }
public void testInvalidDefaultsCheck() throws Exception { XmlBeanDefinitionReader reader = new XmlBeanDefinitionReader(appContext); try { reader.loadBeanDefinitions(new ClassPathResource("osgiInvalidDefaults.xml", getClass())); fail("should have failed since osgi:defaults cannot be used outside the root element"); } catch (BeanDefinitionParsingException ex) { // expected } }
/** * Load bean definitions from the specified Groovy script. * @param encodedResource the resource descriptor for the Groovy script, * allowing to specify an encoding to use for parsing the file * @return the number of bean definitions found * @throws BeanDefinitionStoreException in case of loading or parsing errors */ public int loadBeanDefinitions(EncodedResource encodedResource) throws BeanDefinitionStoreException { Closure beans = new Closure(this){ public Object call(Object[] args) { invokeBeanDefiningClosure((Closure) args[0]); return null; } }; Binding binding = new Binding() { @Override public void setVariable(String name, Object value) { if (currentBeanDefinition !=null) { applyPropertyToBeanDefinition(name, value); } else { super.setVariable(name, value); } } }; binding.setVariable("beans", beans); int countBefore = getRegistry().getBeanDefinitionCount(); try { GroovyShell shell = new GroovyShell(getResourceLoader().getClassLoader(), binding); shell.evaluate(encodedResource.getReader(), encodedResource.getResource().getFilename()); } catch (Throwable ex) { throw new BeanDefinitionParsingException(new Problem("Error evaluating Groovy script: " + ex.getMessage(), new Location(encodedResource.getResource()), null, ex)); } return getRegistry().getBeanDefinitionCount() - countBefore; }
@Test public void testDuplicatePointcutConfig() { try { DefaultListableBeanFactory bf = new DefaultListableBeanFactory(); new XmlBeanDefinitionReader(bf).loadBeanDefinitions( qualifiedResource(getClass(), "pointcutDuplication.xml")); fail("parsing should have caused a BeanDefinitionStoreException"); } catch (BeanDefinitionStoreException ex) { assertTrue(ex.contains(BeanDefinitionParsingException.class)); } }
@Test public void testMissingPointcutConfig() { try { DefaultListableBeanFactory bf = new DefaultListableBeanFactory(); new XmlBeanDefinitionReader(bf).loadBeanDefinitions( qualifiedResource(getClass(), "pointcutMissing.xml")); fail("parsing should have caused a BeanDefinitionStoreException"); } catch (BeanDefinitionStoreException ex) { assertTrue(ex.contains(BeanDefinitionParsingException.class)); } }
@Test public void simpleCircularImportIsDetected() throws Exception { boolean threw = false; try { newParser().parse(loadAsConfigurationSource(A.class), "A"); } catch (BeanDefinitionParsingException ex) { assertTrue("Wrong message. Got: " + ex.getMessage(), ex.getMessage().contains( "Illegal attempt by @Configuration class 'AbstractCircularImportDetectionTests.B' " + "to import class 'AbstractCircularImportDetectionTests.A'")); threw = true; } assertTrue(threw); }
@Test public void complexCircularImportIsDetected() throws Exception { boolean threw = false; try { newParser().parse(loadAsConfigurationSource(X.class), "X"); } catch (BeanDefinitionParsingException ex) { assertTrue("Wrong message. Got: " + ex.getMessage(), ex.getMessage().contains( "Illegal attempt by @Configuration class 'AbstractCircularImportDetectionTests.Z2' " + "to import class 'AbstractCircularImportDetectionTests.Z'")); threw = true; } assertTrue(threw); }
@Test @SuppressWarnings("resource") public void testInvalidConfigScopedProxy() throws Exception { exception.expect(BeanDefinitionParsingException.class); exception.expectMessage(containsString("Cannot define both 'scope-resolver' and 'scoped-proxy' on <component-scan> tag")); exception.expectMessage(containsString("Offending resource: class path resource [org/springframework/context/annotation/scopedProxyInvalidConfigTests.xml]")); new ClassPathXmlApplicationContext("org/springframework/context/annotation/scopedProxyInvalidConfigTests.xml"); }
/** * Load bean definitions from the specified Groovy script or XML file. * <p>Note that {@code ".xml"} files will be parsed as XML content; all other kinds * of resources will be parsed as Groovy scripts. * @param encodedResource the resource descriptor for the Groovy script or XML file, * allowing specification of an encoding to use for parsing the file * @return the number of bean definitions found * @throws BeanDefinitionStoreException in case of loading or parsing errors */ public int loadBeanDefinitions(EncodedResource encodedResource) throws BeanDefinitionStoreException { // Check for XML files and redirect them to the "standard" XmlBeanDefinitionReader String filename = encodedResource.getResource().getFilename(); if (StringUtils.endsWithIgnoreCase(filename, ".xml")) { return this.standardXmlBeanDefinitionReader.loadBeanDefinitions(encodedResource); } Closure beans = new Closure(this) { public Object call(Object[] args) { invokeBeanDefiningClosure((Closure) args[0]); return null; } }; Binding binding = new Binding() { @Override public void setVariable(String name, Object value) { if (currentBeanDefinition != null) { applyPropertyToBeanDefinition(name, value); } else { super.setVariable(name, value); } } }; binding.setVariable("beans", beans); int countBefore = getRegistry().getBeanDefinitionCount(); try { GroovyShell shell = new GroovyShell(getResourceLoader().getClassLoader(), binding); shell.evaluate(encodedResource.getReader(), "beans"); } catch (Throwable ex) { throw new BeanDefinitionParsingException(new Problem("Error evaluating Groovy script: " + ex.getMessage(), new Location(encodedResource.getResource()), null, ex)); } return getRegistry().getBeanDefinitionCount() - countBefore; }
@Test public void beanMethodOverloadingWithoutInheritance() { @SuppressWarnings({ "hiding" }) @Configuration class Config { @Bean String aString() { return "na"; } @Bean String aString(Integer dependency) { return "na"; } } this.thrown.expect(BeanDefinitionParsingException.class); this.thrown.expectMessage("overloaded @Bean methods named 'aString'"); new AnnotationConfigApplicationContext(Config.class); }
/** * Wrapper for Load Bean Definitions * * @param xmlReader * @param resourceName */ private static void loadBeanDefinitions(XmlBeanDefinitionReader xmlReader, String resourceName) throws RuntimeException { try { xmlReader.loadBeanDefinitions(new ClassPathResource(resourceName)); } catch (final BeanDefinitionParsingException bdpe) { if (resourceName.equalsIgnoreCase(defaultSecurity)) { return; } else { throw bdpe; } } }
@Test public void testMultipleElements() throws Exception { this.expectedException.expect(BeanDefinitionParsingException.class); this.expectedException.expectMessage("only allowed once per"); //noinspection ResultOfObjectAllocationIgnored new ClassPathXmlApplicationContext(getClass().getSimpleName() + "-testMultipleElements.xml", getClass()); }
@Test public void testWithEmptyAccessKey() throws Exception { this.expectedException.expect(BeanDefinitionParsingException.class); this.expectedException.expectMessage("The 'access-key' attribute must not be empty"); //noinspection ResultOfObjectAllocationIgnored new ClassPathXmlApplicationContext(getClass().getSimpleName() + "-testWithEmptyAccessKey.xml", getClass()); }
@Test public void testWithEmptySecretKey() throws Exception { this.expectedException.expect(BeanDefinitionParsingException.class); this.expectedException.expectMessage("The 'secret-key' attribute must not be empty"); //noinspection ResultOfObjectAllocationIgnored new ClassPathXmlApplicationContext(getClass().getSimpleName() + "-testWithEmptySecretKey.xml", getClass()); }
@Test public void parse_autoDetectionAndStaticRegionProvider_reportsError() throws Exception { //Arrange this.expectedException.expect(BeanDefinitionParsingException.class); this.expectedException.expectMessage("The attribute 'auto-detect' can only be enabled without a region or region-provider specified"); //Act //noinspection ResultOfObjectAllocationIgnored new ClassPathXmlApplicationContext(getClass().getSimpleName() + "-testAutoDetectionWithConfiguredRegion.xml", getClass()); //Assert }
@Test public void parse_noValidRegionProviderConfigured_reportsError() throws Exception { //Arrange this.expectedException.expect(BeanDefinitionParsingException.class); this.expectedException.expectMessage("Either auto-detect must be enabled, or a region or region-provider must be specified"); //Act //noinspection ResultOfObjectAllocationIgnored new ClassPathXmlApplicationContext(getClass().getSimpleName() + "-testNoValidRegionProviderConfigurationSpecified.xml", getClass()); //Assert }
@Test public void parse_twoRegionProviderConfigured_reportsError() throws Exception { //Arrange this.expectedException.expect(BeanDefinitionParsingException.class); this.expectedException.expectMessage("Multiple <context-region/> elements detected. The <context-region/> element is only allowed once per application context"); //Act //noinspection ResultOfObjectAllocationIgnored new ClassPathXmlApplicationContext(getClass().getSimpleName() + "-testTwoRegionProviderConfigured.xml", getClass()); //Assert }
private void expectException(String resourceName) { try { readCtxFromResource(resourceName); fail("should have thrown parsing exception, invalid resource " + resourceName); } catch (BeanDefinitionParsingException ex) { // expected } }
@Test(expected=BeanDefinitionParsingException.class) public void testFinalBeanMethod() { initBeanFactory(ConfigWithFinalBean.class); }
@Test(expected = BeanDefinitionParsingException.class) public void testConfigFileParsingError() { new GenericGroovyApplicationContext("org/springframework/context/groovy/applicationContext-error.groovy"); }
@Test(expected=BeanDefinitionParsingException.class) public void importingNonConfigurationClassCausesBeanDefinitionParsingException() { new AnnotationConfigApplicationContext(ConfigThatImportsNonConfigClass.class); }
@Test(expected=BeanDefinitionParsingException.class) public void testImportNonConfigurationAnnotationClassCausesError() { processConfigurationClasses(ConfigAnnotated.class); }
@Test public void testMissingTokenUriForClientCredentials() { expected.expect(BeanDefinitionParsingException.class); expected.expectMessage("accessTokenUri must be supplied"); loadContext("type='client_credentials'"); }
@Test public void testMissingAuthorizationUriForImplicit() { expected.expect(BeanDefinitionParsingException.class); expected.expectMessage("authorization URI must be supplied"); loadContext("type='implicit'"); }
@Test public void testMissingAuthorizationUriForAuthorizationCode() { expected.expect(BeanDefinitionParsingException.class); expected.expectMessage("authorization URI must be supplied"); loadContext("type='authorization_code' access-token-uri='http://somewhere.com'"); }
@Test public void testMissingUsernameForPassword() { expected.expect(BeanDefinitionParsingException.class); expected.expectMessage("A username must be supplied on a resource element of type password"); loadContext("type='password' access-token-uri='http://somewhere.com'"); }
@Test public void testMissingPasswordForPassword() { expected.expect(BeanDefinitionParsingException.class); expected.expectMessage("A password must be supplied on a resource element of type password"); loadContext("type='password' username='admin' access-token-uri='http://somewhere.com'"); }