james
james

Reputation: 1687

Need to make a simple spring 3 example work

I am learning spring 3 from a book and I get an exception in the first example itself. It is given below. My project can be downloaded as a zip file from the link - https://github.com/double-whammy/prospring3.git

My environment - Eclipse STS (Eclipse for Spring)

Exception:

INFO t.support.ClassPathXmlApplicationContext: 456 - Refreshing org.springframework.context.support.ClassPathXmlApplicationContext@497e4b: startup date [Wed Jul 23 10:05:47 PDT 2014]; 
root of context hierarchy
INFO eans.factory.xml.XmlBeanDefinitionReader: 315 - Loading XML bean definitions from class path resource [META-INF/spring/app-context.xml]

Exception in thread "main" org.springframework.beans.factory.xml.XmlBeanDefinitionStoreException: Line 13 in XML document from class path resource [META-INF/spring/app-context.xml] is invalid; nested exception is org.xml.sax.SAXParseException; lineNumber: 13; columnNumber: 38; The prefix "p" for attribute "p:messageProvider-ref" associated with an element type "bean" is not bound.
    at org.springframework.beans.factory.xml.XmlBeanDefinitionReader.doLoadBeanDefinitions(XmlBeanDefinitionReader.java:396)
    at org.springframework.beans.factory.xml.XmlBeanDefinitionReader.loadBeanDefinitions(XmlBeanDefinitionReader.java:334)
    at org.springframework.beans.factory.xml.XmlBeanDefinitionReader.loadBeanDefinitions(XmlBeanDefinitionReader.java:302)
    at org.springframework.beans.factory.support.AbstractBeanDefinitionReader.loadBeanDefinitions(AbstractBeanDefinitionReader.java:143)
    at org.springframework.beans.factory.support.AbstractBeanDefinitionReader.loadBeanDefinitions(AbstractBeanDefinitionReader.java:178)
    at org.springframework.beans.factory.support.AbstractBeanDefinitionReader.loadBeanDefinitions(AbstractBeanDefinitionReader.java:149)
    at org.springframework.beans.factory.support.AbstractBeanDefinitionReader.loadBeanDefinitions(AbstractBeanDefinitionReader.java:212)
    at org.springframework.context.support.AbstractXmlApplicationContext.loadBeanDefinitions(AbstractXmlApplicationContext.java:126)
    at org.springframework.context.support.AbstractXmlApplicationContext.loadBeanDefinitions(AbstractXmlApplicationContext.java:92)
    at org.springframework.context.support.AbstractRefreshableApplicationContext.refreshBeanFactory(AbstractRefreshableApplicationContext.java:130)
    at org.springframework.context.support.AbstractApplicationContext.obtainFreshBeanFactory(AbstractApplicationContext.java:467)
    at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:397)
    at org.springframework.context.support.ClassPathXmlApplicationContext.<init>(ClassPathXmlApplicationContext.java:139)
    at org.springframework.context.support.ClassPathXmlApplicationContext.<init>(ClassPathXmlApplicationContext.java:83)
    at com.apress.prospring3.ch2.HelloWorldSpringDI.main(HelloWorldSpringDI.java:9)
Caused by: org.xml.sax.SAXParseException; lineNumber: 13; columnNumber: 38; The prefix "p" for attribute "p:messageProvider-ref" associated with an element type "bean" is not bound.
    at com.sun.org.apache.xerces.internal.util.ErrorHandlerWrapper.createSAXParseException(Unknown Source)
    at com.sun.org.apache.xerces.internal.util.ErrorHandlerWrapper.fatalError(Unknown Source)
    at com.sun.org.apache.xerces.internal.impl.XMLErrorReporter.reportError(Unknown Source)
    at com.sun.org.apache.xerces.internal.impl.XMLErrorReporter.reportError(Unknown Source)
    at com.sun.org.apache.xerces.internal.impl.XMLErrorReporter.reportError(Unknown Source)
    at com.sun.org.apache.xerces.internal.impl.XMLNSDocumentScannerImpl.scanStartElement(Unknown Source)
    at com.sun.org.apache.xerces.internal.impl.XMLDocumentFragmentScannerImpl$FragmentContentDriver.next(Unknown Source)
    at com.sun.org.apache.xerces.internal.impl.XMLDocumentScannerImpl.next(Unknown Source)
    at com.sun.org.apache.xerces.internal.impl.XMLNSDocumentScannerImpl.next(Unknown Source)
    at com.sun.org.apache.xerces.internal.impl.XMLDocumentFragmentScannerImpl.scanDocument(Unknown Source)
    at com.sun.org.apache.xerces.internal.parsers.XML11Configuration.parse(Unknown Source)
    at com.sun.org.apache.xerces.internal.parsers.XML11Configuration.parse(Unknown Source)
    at com.sun.org.apache.xerces.internal.parsers.XMLParser.parse(Unknown Source)
    at com.sun.org.apache.xerces.internal.parsers.DOMParser.parse(Unknown Source)
    at com.sun.org.apache.xerces.internal.jaxp.DocumentBuilderImpl.parse(Unknown Source)
    at org.springframework.beans.factory.xml.DefaultDocumentLoader.loadDocument(DefaultDocumentLoader.java:75)
    at org.springframework.beans.factory.xml.XmlBeanDefinitionReader.doLoadBeanDefinitions(XmlBeanDefinitionReader.java:388)
    ... 14 more

Spring XML Application Configuration xml file:

<?xml version="1.0" encoding="UTF-8"?> 
<beans xmlns="http://www.springframework.org/schema/beans" 
xmlns:xsi=http://www.w3.org/2001/XMLSchema-instance 
xmlns:p="http://www.springframework.org/schema/p" 
xmlns:context="http://www.springframework.org/schema/context" 
xsi:schemaLocation="http://www.springframework.org/schema/beans 
http://www.springframework.org/schema/beans/spring-beans-3.0.xsd 
http://www.springframework.org/schema/context 
http://www.springframework.org/schema/context/spring-context-3.0.xsd"> 
<bean id="provider" class="com.apress.prospring3.ch2.HelloWorldMessageProvider"/> 
<bean id="renderer" class="com.apress.prospring3.ch2.StandardOutMessageRenderer" 
p:messageProvider-ref="provider"/> 
</beans>

Upvotes: 3

Views: 2363

Answers (4)

tury_nguyen
tury_nguyen

Reputation: 31

You can not use: p:messageProvider-ref="provider", it was in spring 2.5

use this:

<bean id="renderer" class="com.appress.prospring3.ch2.StandardOutMessageRenderer">      
        <property name="messageProvider" ref="provider"></property>
</bean>

Upvotes: 1

Runnerdave
Runnerdave

Reputation: 455

The problem you have is related to the fact that maven only picks one of the spring.handlers files from all the different spring jars.

To solve this use the following link: http://maven.apache.org/plugins/maven-shade-plugin/examples/resource-transformers.html#Merging_Content_of_Specific_Files_with_AppendingTransformer_and_XmlAppendingTransformer

Note that you have to use the maven Assembly Plugin.

Similar problems as yours are explained here: http://blog.idm.fr/2009/09/maven-assembly-plugin-and-spring-namespace-handlers.html

Upvotes: 0

james
james

Reputation: 1687

The error is because there are no quotes around the value of xmlns:xsi. Correction - xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" Pro spring 3 book sucks.

full xml

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:p="http://www.springframework.org/schema/p"
    xmlns:context="http://www.springframework.org/schema/context"
    xsi:schemaLocation="http://www.springframework.org/schema/beans 
http://www.springframework.org/schema/beans/spring-beans-3.0.xsd 
http://www.springframework.org/schema/context 
http://www.springframework.org/schema/context/spring-context-3.0.xsd">
    <bean id="provider" class="com.apress.prospring3.ch2.HelloWorldMessageProvider" />
    <bean id="renderer" class="com.apress.prospring3.ch2.StandardOutMessageRenderer"
        p:messageProvider-ref="provider" />

Upvotes: 0

Ralph
Ralph

Reputation: 120871

It is because your xml is a invalid:

the header has a mistake: there the xsi attribute value needs its double quotes!

xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"

<bean id="renderer" class="com.apress.prospring3.ch2.StandardOutMessageRenderer" p:messageProvider-ref="provider"/>

I do not know what you want to configure, but a p:messageProvider-ref as an attribute is invalid xml.

I thing you wanted to express something like a bean renderer of type StandardOutMessageRenderer that use the bean provider for its MessageProvider.

<bean id="provider" class="com.apress.prospring3.ch2.HelloWorldMessageProvider"/> <bean id="renderer" class="com.apress.prospring3.ch2.StandardOutMessageRenderer"><property name="messageProvider" ref="provider"/></bean>

Upvotes: 1

Related Questions