Spring 3.0.5 / Tiles 2.2 Error - spring-mvc

I have a large application used in a production environment. My tiles setup is complex, with many tiles per page. The application works great with the exception of one thing. After starting the server the first page load throws an exception, an error in
apache.commons.digester.Digester at line 789/Digester.getParser
It throws this:
UnsupportedOperationException:: This parser does not support specification "null" version null"
The amazing thing is, this error only happens on the first page load, all subsequent loads work just fine. Looking for help with this, let me know what info you need. Thanks in advance.
This is the nested stack trace:
ERROR 08-12-11 15:30:05 (apache.commons.digester.Digester:789) ***Digester.getParser: ***
java.lang.UnsupportedOperationException: This parser does not support specification "null" version "null"
at javax.xml.parsers.SAXParserFactory.setXIncludeAware(SAXParserFactory.java:448)
at org.apache.commons.digester.Digester.getFactory(Digester.java:534)
at org.apache.commons.digester.Digester.getParser(Digester.java:786)
at org.apache.commons.digester.Digester.getXMLReader(Digester.java:1058)
at org.apache.commons.digester.Digester.parse(Digester.java:1887)
at org.apache.tiles.definition.digester.DigesterDefinitionsReader.read(DigesterDefinitionsReader.java:329)
at org.apache.tiles.definition.dao.BaseLocaleUrlDefinitionDAO.loadDefinitionsFromURL(BaseLocaleUrlDefinitionDAO.java:276)
at org.apache.tiles.definition.dao.CachingLocaleUrlDefinitionDAO.loadDefinitionsFromURLs(CachingLocaleUrlDefinitionDAO.java:251)
at org.apache.tiles.definition.dao.ResolvingLocaleUrlDefinitionDAO.loadDefinitionsFromURLs(ResolvingLocaleUrlDefinitionDAO.java:65)
at org.apache.tiles.definition.dao.ResolvingLocaleUrlDefinitionDAO.loadParentDefinitions(ResolvingLocaleUrlDefinitionDAO.java:58)
at org.apache.tiles.definition.dao.CachingLocaleUrlDefinitionDAO.loadDefinitionsFromURLs(CachingLocaleUrlDefinitionDAO.java:239)
at org.apache.tiles.definition.dao.ResolvingLocaleUrlDefinitionDAO.loadDefinitionsFromURLs(ResolvingLocaleUrlDefinitionDAO.java:65)
at org.apache.tiles.definition.dao.ResolvingLocaleUrlDefinitionDAO.loadParentDefinitions(ResolvingLocaleUrlDefinitionDAO.java:58)
at org.apache.tiles.definition.dao.CachingLocaleUrlDefinitionDAO.loadDefinitionsFromURLs(CachingLocaleUrlDefinitionDAO.java:239)
at org.apache.tiles.definition.dao.ResolvingLocaleUrlDefinitionDAO.loadDefinitionsFromURLs(ResolvingLocaleUrlDefinitionDAO.java:65)
at org.apache.tiles.definition.dao.CachingLocaleUrlDefinitionDAO.loadDefinitions(CachingLocaleUrlDefinitionDAO.java:222)
at org.apache.tiles.definition.dao.CachingLocaleUrlDefinitionDAO.checkAndloadDefinitions(CachingLocaleUrlDefinitionDAO.java:204)
at org.apache.tiles.definition.dao.CachingLocaleUrlDefinitionDAO.getDefinitions(CachingLocaleUrlDefinitionDAO.java:154)
at org.apache.tiles.definition.dao.CachingLocaleUrlDefinitionDAO.getDefinition(CachingLocaleUrlDefinitionDAO.java:123)
at org.apache.tiles.definition.dao.CachingLocaleUrlDefinitionDAO.getDefinition(CachingLocaleUrlDefinitionDAO.java:54)
at org.apache.tiles.definition.UnresolvingLocaleDefinitionsFactory.getDefinition(UnresolvingLocaleDefinitionsFactory.java:105)
at org.apache.tiles.impl.BasicTilesContainer.getDefinition(BasicTilesContainer.java:364)
at org.apache.tiles.impl.BasicTilesContainer.render(BasicTilesContainer.java:618)
at org.apache.tiles.impl.BasicTilesContainer.render(BasicTilesContainer.java:321)
at org.springframework.web.servlet.view.tiles2.TilesView.renderMergedOutputModel(TilesView.java:124)
at org.springframework.web.servlet.view.AbstractView.render(AbstractView.java:250)
at org.springframework.web.servlet.DispatcherServlet.render(DispatcherServlet.java:1047)
at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:817)
at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:719)
at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:644)
at org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:549)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:707)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:820)
at weblogic.servlet.internal.StubSecurityHelper$ServletServiceAction.run(StubSecurityHelper.java:227)
at weblogic.servlet.internal.StubSecurityHelper.invokeServlet(StubSecurityHelper.java:125)
at weblogic.servlet.internal.ServletStubImpl.execute(ServletStubImpl.java:292)
at weblogic.servlet.internal.ServletStubImpl.execute(ServletStubImpl.java:175)
at weblogic.servlet.internal.WebAppServletContext$ServletInvocationAction.run(WebAppServletContext.java:3498)
at weblogic.security.acl.internal.AuthenticatedSubject.doAs(AuthenticatedSubject.java:321)
at weblogic.security.service.SecurityManager.runAs(Unknown Source)
at weblogic.servlet.internal.WebAppServletContext.securedExecute(WebAppServletContext.java:2180)
at weblogic.servlet.security.internal.AuthFilterChain$LastFilter.doFilter(AuthFilterChain.java:45)
at weblogic.servlet.security.internal.AuthFilterChain.doFilter(AuthFilterChain.java:37)
at com.bea.common.security.internal.service.NegotiateIdentityAsserterServiceImpl.callChain(NegotiateIdentityAsserterServiceImpl.java:145)
at com.bea.common.security.internal.service.NegotiateIdentityAsserterServiceImpl.process(NegotiateIdentityAsserterServiceImpl.java:132)
at sun.reflect.GeneratedMethodAccessor679.invoke(Unknown Source)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
at java.lang.reflect.Method.invoke(Method.java:597)
at com.bea.common.security.internal.utils.Delegator$ProxyInvocationHandler.invoke(Delegator.java:57)
at $Proxy19.process(Unknown Source)
at weblogic.security.providers.authentication.NegotiateIdentityAsserterServletAuthenticationFilter.doFilter(NegotiateIdentityAsserterServletAuthenticationFilter.java:35)
at weblogic.servlet.security.internal.AuthFilterChain.doFilter(AuthFilterChain.java:37)
at weblogic.servlet.security.internal.SecurityModule$ServletAuthenticationFilterAction.run(SecurityModule.java:612)
at weblogic.security.acl.internal.AuthenticatedSubject.doAs(AuthenticatedSubject.java:321)
at weblogic.security.service.SecurityManager.runAs(Unknown Source)
at weblogic.servlet.security.internal.SecurityModule.invokeAuthFilterChain(SecurityModule.java:501)
at weblogic.servlet.security.internal.CertSecurityModule.checkUserPerm(CertSecurityModule.java:97)
at weblogic.servlet.security.internal.SecurityModule.checkAccess(SecurityModule.java:106)
at weblogic.servlet.security.internal.ServletSecurityManager.checkAccess(ServletSecurityManager.java:82)
at weblogic.servlet.internal.WebAppServletContext.securedExecute(WebAppServletContext.java:2116)
at weblogic.servlet.internal.WebAppServletContext.execute(WebAppServletContext.java:2086)
at weblogic.servlet.internal.ServletRequestImpl.run(ServletRequestImpl.java:1406)
at weblogic.work.ExecuteThread.execute(ExecuteThread.java:201)
at weblogic.work.ExecuteThread.run(ExecuteThread.java:173)
Full Stack Trace (Errors above are nested within this exception):
GET /*****_Cust_Search/CustomerDetail?customerId=9 HTTP/1.1
Connection: keep-alive
User-Agent: Mozilla/5.0 (Windows NT 5.1) AppleWebKit/535.1 (KHTML, like Gecko) Chrome/13.0.782.107 Safari/535.1
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Encoding: gzip,deflate,sdch
Accept-Language: en-US,en;q=0.8
Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.3
Cookie: nde-textsize=16px; JSESSIONID_CUSTDETAIL=Bnx0TByHMyvvyDBGb0p9TgCDy1h0n2hlzpckxhdYTsCQ5nJLVSzB!1674277528; ADMINCONSOLESESSION=Gh8nTD9Zpcn26tJBNLVl6q1ZqpQ1jrKTT27ZDL6yLvvvLLC2gjwZ!-975699351; JSESSIONID_CUST=l6GGTGKFYQV1cZ8cnJs2G2891JWclP6FnsDr1vL8bPXvTQpJjn9H!-975699351; JSESSIONID_INSURANCEDETAIL=J1lvTGKQ9G13SM8vYMzG1QPB2R939HQDMgHyJM1GpLG6fyvTJHVX!-975699351; JSESSIONID=gpGtTGYfTKwqh9dG6Q1T305LnbHpGJr6WVNHbx6TQwglXc9lPqgL!-975699351
]] Root cause of ServletException.
java.lang.NullPointerException
at org.apache.commons.digester.Digester.getXMLReader(Digester.java:1058)
at org.apache.commons.digester.Digester.parse(Digester.java:1887)
at org.apache.tiles.definition.digester.DigesterDefinitionsReader.read(DigesterDefinitionsReader.java:329)
at org.apache.tiles.definition.dao.BaseLocaleUrlDefinitionDAO.loadDefinitionsFromURL(BaseLocaleUrlDefinitionDAO.java:276)
at org.apache.tiles.definition.dao.CachingLocaleUrlDefinitionDAO.loadDefinitionsFromURLs(CachingLocaleUrlDefinitionDAO.java:251)
at org.apache.tiles.definition.dao.ResolvingLocaleUrlDefinitionDAO.loadDefinitionsFromURLs(ResolvingLocaleUrlDefinitionDAO.java:65)
at org.apache.tiles.definition.dao.ResolvingLocaleUrlDefinitionDAO.loadParentDefinitions(ResolvingLocaleUrlDefinitionDAO.java:58)
at org.apache.tiles.definition.dao.CachingLocaleUrlDefinitionDAO.loadDefinitionsFromURLs(CachingLocaleUrlDefinitionDAO.java:239)
at org.apache.tiles.definition.dao.ResolvingLocaleUrlDefinitionDAO.loadDefinitionsFromURLs(ResolvingLocaleUrlDefinitionDAO.java:65)
at org.apache.tiles.definition.dao.ResolvingLocaleUrlDefinitionDAO.loadParentDefinitions(ResolvingLocaleUrlDefinitionDAO.java:58)
at org.apache.tiles.definition.dao.CachingLocaleUrlDefinitionDAO.loadDefinitionsFromURLs(CachingLocaleUrlDefinitionDAO.java:239)
at org.apache.tiles.definition.dao.ResolvingLocaleUrlDefinitionDAO.loadDefinitionsFromURLs(ResolvingLocaleUrlDefinitionDAO.java:65)
at org.apache.tiles.definition.dao.CachingLocaleUrlDefinitionDAO.loadDefinitions(CachingLocaleUrlDefinitionDAO.java:222)
at org.apache.tiles.definition.dao.CachingLocaleUrlDefinitionDAO.checkAndloadDefinitions(CachingLocaleUrlDefinitionDAO.java:204)
at org.apache.tiles.definition.dao.CachingLocaleUrlDefinitionDAO.getDefinitions(CachingLocaleUrlDefinitionDAO.java:154)
at org.apache.tiles.definition.dao.CachingLocaleUrlDefinitionDAO.getDefinition(CachingLocaleUrlDefinitionDAO.java:123)
at org.apache.tiles.definition.dao.CachingLocaleUrlDefinitionDAO.getDefinition(CachingLocaleUrlDefinitionDAO.java:54)
at org.apache.tiles.definition.UnresolvingLocaleDefinitionsFactory.getDefinition(UnresolvingLocaleDefinitionsFactory.java:105)
at org.apache.tiles.impl.BasicTilesContainer.getDefinition(BasicTilesContainer.java:364)
at org.apache.tiles.impl.BasicTilesContainer.render(BasicTilesContainer.java:618)
at org.apache.tiles.impl.BasicTilesContainer.render(BasicTilesContainer.java:321)
at org.springframework.web.servlet.view.tiles2.TilesView.renderMergedOutputModel(TilesView.java:124)
at org.springframework.web.servlet.view.AbstractView.render(AbstractView.java:250)
at org.springframework.web.servlet.DispatcherServlet.render(DispatcherServlet.java:1047)
at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:817)
at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:719)
at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:644)
at org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:549)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:707)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:820)
at weblogic.servlet.internal.StubSecurityHelper$ServletServiceAction.run(StubSecurityHelper.java:227)
at weblogic.servlet.internal.StubSecurityHelper.invokeServlet(StubSecurityHelper.java:125)
at weblogic.servlet.internal.ServletStubImpl.execute(ServletStubImpl.java:292)
at weblogic.servlet.internal.ServletStubImpl.execute(ServletStubImpl.java:175)
at weblogic.servlet.internal.WebAppServletContext$ServletInvocationAction.run(WebAppServletContext.java:3498)
at weblogic.security.acl.internal.AuthenticatedSubject.doAs(AuthenticatedSubject.java:321)
at weblogic.security.service.SecurityManager.runAs(Unknown Source)
at weblogic.servlet.internal.WebAppServletContext.securedExecute(WebAppServletContext.java:2180)
at weblogic.servlet.internal.WebAppServletContext.execute(WebAppServletContext.java:2086)
at weblogic.servlet.internal.ServletRequestImpl.run(ServletRequestImpl.java:1406)
at weblogic.work.ExecuteThread.execute(ExecuteThread.java:201)
at weblogic.work.ExecuteThread.run(ExecuteThread.java:173)
This is the root-context.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"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd">
<!-- Root Context: defines shared resources visible to all other web components -->
<bean id="tilesConfigurer" class="org.springframework.web.servlet.view.tiles2.TilesConfigurer">
<property name="definitions">
<list>
<value>/WEB-INF/tiles/Templates.xml</value>
</list>
</property>
<property name="preparerFactoryClass" value="org.springframework.web.servlet.view.tiles2.SpringBeanPreparerFactory"/>
</bean>
</beans>
This is the servlet-context.xml
<?xml version="1.0" encoding="UTF-8"?>
<beans:beans xmlns="http://www.springframework.org/schema/mvc"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:beans="http://www.springframework.org/schema/beans"
xsi:schemaLocation="
http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-3.0.xsd
http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd">
<!-- DispatcherServlet Context: defines this servlet's request-processing infrastructure -->
<!-- Enables the Spring MVC #Controller programming model -->
<annotation-driven />
<!-- Resolves views selected for rendering by #Controllers to .jsp resources in the /WEB-INF/views directory -->
<!-- <beans:bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">-->
<!-- <beans:property name="viewClass" value="org.springframework.web.servlet.view.JstlView"/>-->
<!-- <beans:property name="prefix" value="/WEB-INF/views/" />-->
<!-- <beans:property name="suffix" value=".jsp" />-->
<!-- </beans:bean>-->
<!-- Imports user-defined #Controller beans that process client requests -->
<beans:import resource="controllers.xml" />
<beans:bean class="org.springframework.web.servlet.view.ResourceBundleViewResolver">
<beans:property name="basename" value="tiles"/>
</beans:bean>
<beans:bean id="messageSource" class="org.springframework.context.support.ResourceBundleMessageSource">
<beans:property name="basenames">
<beans:list>
<beans:value>customer</beans:value>
</beans:list>
</beans:property>
</beans:bean>
</beans:beans>
controllers.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:mvc="http://www.springframework.org/schema/mvc"
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/mvc http://www.springframework.org/schema/mvc/spring-mvc-3.0.xsd
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.0.xsd">
<!-- Scans within the base package of the application for #Components to configure as beans -->
<context:component-scan base-package="redacted.controllers" />
</beans>
tiles.properties
CustomerTile.(class)=org.springframework.web.servlet.view.tiles2.TilesView
CustomerTile.url=CustomerTile
CustomerSearchForm.(class)=org.springframework.web.servlet.view.tiles2.TilesView
CustomerSearchForm.url=CustomerSearchForm
CustomerSearchResults.(class)=org.springframework.web.servlet.view.tiles2.TilesView
CustomerSearchResults.url=CustomerSearchResults
EditCustomer.(class)=org.springframework.web.servlet.view.tiles2.TilesView
EditCustomer.url=EditCustomer
NewCustomer.(class)=org.springframework.web.servlet.view.tiles2.TilesView
NewCustomer.url=NewCustomer
(My Tile Templates) templates.xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE tiles-definitions PUBLIC
"-//Apache Software Foundation//DTD Tiles Configuration 2.1//EN"
"http://tiles.apache.org/dtds/tiles-config_2_1.dtd">
<tiles-definitions>
<definition name="baseLayout" template="/WEB-INF/tiles/main-container-tile.jsp">
<put-attribute name="title" value="AMHOM" />
<put-attribute name="header" value="normalheader" />
<put-attribute name="body" value="/WEB-INF/tiles/body.jsp" />
<put-attribute name="footer" value="/WEB-INF/tiles/footer-tile.jsp" />
</definition>
<definition name="baseLayout2" template="/WEB-INF/tiles/main-container-tile.jsp">
<put-attribute name="title" value="AMHOM" />
<put-attribute name="header" value="custdetailheader" />
<put-attribute name="body" value="/WEB-INF/tiles/body.jsp" />
<put-attribute name="footer" value="/WEB-INF/tiles/footer-tile.jsp" />
</definition>
<definition name="baseLayout3" template="/WEB-INF/tiles/main-container-tile.jsp">
<put-attribute name="title" value="AMHOM" />
<put-attribute name="header" value="editcustheader" />
<put-attribute name="body" value="/WEB-INF/tiles/body.jsp" />
<put-attribute name="footer" value="/WEB-INF/tiles/footer-tile.jsp" />
</definition>
<definition name="normalheader" template="/WEB-INF/tiles/header-tile.jsp">
<put-attribute name="menutabs" value="/WEB-INF/tiles/tabs.jsp" />
</definition>
<definition name="notabsheader" template="/WEB-INF/tiles/header-tile.jsp">
<put-attribute name="menutabs" value="/WEB-INF/tiles/notabs.jsp" />
</definition>
<definition name="custdetailheader" template="/WEB-INF/tiles/header-tile.jsp">
<put-attribute name="menutabs" value="/WEB-INF/tiles/custdetail_tabs-tile.jsp" />
</definition>
<definition name="editcustheader" template="/WEB-INF/tiles/header-tile.jsp">
<put-attribute name="menutabs" value="/WEB-INF/tiles/editcust_tabs-tile.jsp" />
</definition>
<definition name="completecust" template="/WEB-INF/tiles/custdetail_complete-tile.jsp">
<put-attribute name="navigation" value="/WEB-INF/tiles/custdetail_cpapnav-tile.jsp" />
<put-attribute name="customertile" value="/WEB-INF/tiles/custdetail_content-tile.jsp" />
<put-attribute name="diagtile" value="/WEB-INF/tiles/custdetail_diagnosis-tile.jsp" />
<put-attribute name="resptile" value="/WEB-INF/tiles/custdetail_responsibleparty-tile.jsp" />
<put-attribute name="doctortile" value="/WEB-INF/tiles/custdetail_doctor-tile.jsp" />
<put-attribute name="insurancetile" value="/WEB-INF/tiles/custdetail_insurance-tile.jsp" />
</definition>
<definition name="customersearch" template="/WEB-INF/tiles/customersearch_complete-tile.jsp">
<put-attribute name="errors-tile" value="/WEB-INF/tiles/customersearchform_errors-tile.jsp" />
<put-attribute name="content-tile" value="/WEB-INF/tiles/customersearchform_content-tile.jsp" />
</definition>
<definition name="custsearchresults" template="/WEB-INF/tiles/custsearchresults_complete-tile.jsp">
<put-attribute name="errors-tile" value="/WEB-INF/tiles/customersearchform_errors-tile.jsp" />
<put-attribute name="content-tile" value="/WEB-INF/tiles/custsearchresults_content-tile.jsp" />
</definition>
<definition name="editcust" template="/WEB-INF/tiles/editcust_complete-tile.jsp">
<put-attribute name="navigation" value="/WEB-INF/tiles/custdetail_cpapnav-tile.jsp" />
<put-attribute name="editcustomertile" value="/WEB-INF/tiles/editcust_content-tile.jsp" />
</definition>
<definition name="newcust" template="/WEB-INF/tiles/newcust_complete-tile.jsp">
<put-attribute name="navigation" value="" />
<put-attribute name="newcustomertile" value="/WEB-INF/tiles/newcust_content-tile.jsp" />
</definition>
<definition name="CustomerSearchForm" extends="baseLayout">
<put-attribute name="title" value="" />
<put-attribute name="appName" value="Customer Search" />
<put-attribute name="body" value="customersearch" />
</definition>
<definition name="CustomerSearchResults" extends="baseLayout">
<put-attribute name="title" value="" />
<put-attribute name="appName" value="Customer Search" />
<put-attribute name="body" value="custsearchresults" />
</definition>
<definition name="CustomerTile" extends="baseLayout2">
<put-attribute name="title" value="Customer Display" />
<put-attribute name="appName" value="Customer Display" />
<put-attribute name="body" value="completecust" />
</definition>
<definition name="EditCustomer" extends="baseLayout3">
<put-attribute name="title" value="Edit Customer" />
<put-attribute name="appName" value="Edit Customer" />
<put-attribute name="body" value="editcust" />
</definition>
<definition name="NewCustomer" extends="baseLayout3">
<put-attribute name="title" value="New Customer" />
<put-attribute name="appName" value="New Customer" />
<put-attribute name="body" value="newcust" />
</definition>
</tiles-definitions>

I had this problem today so thought I'd add a post, the problem was because of AppSensor (actually its ESAPI 2.0GA dependency), which comes with two different versions of xerces in its includes (2.6.1 from xom depenency, and 2.8.1 from antisamy dependency), but 2.6.1 comes before 2.8.1 so 2.8.1 is not included and the exception happens.
Fixed by adding a 2.8.1 dependency just before the AppSensor dependency in my POM:
<dependency>
<groupId>xerces</groupId>
<artifactId>xercesImpl</artifactId>
<version>2.8.1</version>
</dependency>
<dependency>
<groupId>org.owasp.appsensor</groupId>
<artifactId>AppSensor</artifactId>
<version>${appsensor.version}</version>
</dependency>

There is some issue with weblogic windows installation.
Set this value in your setDomainEnv.cmd and restart the server.
set JAVA_OPTIONS=%JAVA_OPTIONS% -Djavax.xml.parsers.SAXParserFactory=com.sun.org.apache.xerces.internal.jaxp.SAXParserFactoryImpl

Spring 3.2.1 with tiles 2.2.2 caused the same error. It was solved by updating xerxesimpl. Here is a snippet of the pom.xml
<properties>
<java-version>1.6</java-version>
<org.slf4j.version>1.5.8</org.slf4j.version>
<log4j.version>1.2.16</log4j.version>
<xercesImpl.version>2.9.1</xercesImpl.version>
<org.springframework-version>3.1.2.RELEASE</org.springframework-version>
<tiles.core.api.servlet.jsp.version>2.2.2</tiles.core.api.servlet.jsp.version>
</properties>

You can also get this error if you do something stupid like duplicate the tag at the top of your file:
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE tiles-definitions PUBLIC
"-//Apache Software Foundation//DTD Tiles Configuration 3.0//EN"
"http://tiles.apache.org/dtds/tiles-config_3_0.dtd">
<tiles-definitions>
<tiles-definitions>
<definition name="base.page.definition" template="/WEB-INF/layout/basePageLayout.jsp">
...
Hopefully your eyes are sharper than mine and you won't have to come all the way to SO to realize your sloppines....:)

Related

Tiles 3 how to reference another definition in put-attribute

I'd like to be able to define a base definition, where I can inherit a list of styles and scripts. then define a page definition that inherits base definition, and adds page specific styles and scripts. Is this possible -or am I not thinking about this in the right way? I would have thought this to be a fairly basic idea.
base definitions
<tiles-definitions>
<!-- base styles -->
<definition name="base.styles" >
<put-list-attribute name="styles" cascade="true" >
<add-attribute value="/view/common/jquery-ui-theme-base-v1.12.1.css" />
</put-list-attribute>
</definition>
<!-- base scripts -->
<definition name="base.scripts" >
<put-list-attribute name="scripts" cascade="true" >
<add-attribute value="https://code.jquery.com/jquery-3.1.0.min.js" />
<add-attribute value="https://code.jquery.com/ui/1.12.1/jquery-ui.min.js" />
</put-list-attribute>
</definition>
<!-- base definition -->
<definition name="base.definition" template="/WEB-INF/page/defaultLayout.jsp" >
<put-attribute name="title" />
<put-attribute name="styles" value="base.styles.styles" cascade="true" />
<put-attribute name="header" value="/WEB-INF/page/common/header.jsp" />
<put-attribute name="body" />
<put-attribute name="scripts" value="base.scripts.scripts" cascade="true" />
<put-attribute name="footer" value="/WEB-INF/page/common/footer.jsp" />
</definition>
</tiles-definitions>
note the values of the put-attribute match the names of the definitions above them. (my guess is this isn't correct)
page specific definitions
<tiles-definitions>
<!-- page specific styles -->
<definition name="samplePage.styles" extends="base.styles" >
<put-list-attribute name="styles" inherit="true" >
<add-attribute value="/view/page/samplePage/samplePageStyles.css" />
</put-list-attribute>
</definition>
<!-- page specific scripts -->
<definition name="samplePage.scripts" extends="base.scripts" >
<put-list-attribute name="scripts" inherit="true" >
<add-attribute value="/view/page/samplePage/samplePageScript.js" />
</put-list-attribute>
</definition>
<!-- page specific definition -->
<definition name="samplePage" extends="base.definition" >
<put-attribute name="title" value="Sample Page" />
<put-attribute name="styles" value="samplePage.styles" cascade="true" />
<put-attribute name="body" value="/WEB-INF/page/samplePage/samplePageBody" />
<put-attribute name="scripts" value="samplePage.scripts" cascade="true" />
</definition>
</tiles-definitions>
again -note the values of the put-attribute match the names of the definitions above them. (probably not correct?)
I'm currently getting an IllegalArgumentException
Caused by: java.lang.IllegalArgumentException: Cannot convert samplePage.styles of type class java.lang.String to class org.apache.tiles.Attribute
at com.sun.el.lang.ELSupport.coerceToType(ELSupport.java:428)
at com.sun.el.ExpressionFactoryImpl.coerceToType(ExpressionFactoryImpl.java:85)
... 104 more
It appears as if the put-attributes for the styles and scripts are not picking up the definitions of the same name above them... but I'm not sure what to do to correct it. Any ideas?
To answer the question how to reference another definition in put-attribute, this appears to be fairly easy with jsp components such as the following (note the definition, and the 'type' attribute):
<definition name="default.header" template="/WEB-INF/page/common/header.jsp" />
... then elsewhere...
<put-attribute name="header" type="definition" value="default.header" />
However, it doesn't look like this can be done with resources such as stylesheets and scripts, as they don't translate back to an actual template. So, I reworked my base-definition as follows, which still allows me to have 'global' resources, as well as 'page-specific' resources. Also allows me to write the jsp components once, define them once, and reference them many times.
common definitions (tiles.common.xml)
<tiles-definitions>
<definition name="default.header" template="/WEB-INF/page/common/header.jsp" />
<definition name="default.footer" template="/WEB-INF/page/common/footer.jsp" />
[... all the other common components...]
</tiles-definitions>
base definition (tiles.base.xml)
<tiles-definitions>
<definition name="base.definition" template="/WEB-INF/page/baseLayout.jsp" >
<put-attribute name="title" type="string" />
<put-attribute name="header" type="definition" value="default.header" />
<put-attribute name="body" />
<put-attribute name="footer" type="definition" value="default.footer" />
<put-list-attribute name="styles" inherit="true" >
<add-attribute value="/view/common/jquery-ui-theme-base-v1.12.1.css" />
[... other styles common to all pages...]
</put-list-attribute>
<put-list-attribute name="scripts" inherit="true" >
<add-attribute value="https://code.jquery.com/jquery-3.1.0.min.js" />
<add-attribute value="https://code.jquery.com/ui/1.12.1/jquery-ui.min.js" />
[... other scripts common to all pages...]
</put-list-attribute>
</definition>
</tiles-definition>
page specific definition (tiles.samplePage.xml)
<tiles-definitions>
<definition name="samplePage" extends="base.definition" >
<put-attribute name="title" value="Sample Page" />
<put-attribute name="body" value="/WEB-INF/page/samplePage.jsp" />
<put-list-attribute name="styles" inherit="true" >
<add-attribute value="/view/pages/samplePage.css" />
[... other page specific styles ...]
</put-list-attribute>
<put-list-attribute name="scripts" inherit="true" >
<add-attribute value="/view/pages/samplePage.js" />
[... other page specific scripts ...]
</put-list-attribute>
</definition>
</tiles-definition>

Next state is not getting called in spring web flow

I have Spring 3 application having Tiles2 as view resolver. Whenever I am clicking on "submit" button next jsp page should be displayed but it stays on same page.
I have a file WebFlow.xml file inside /WEB-INF/flow directory and JSPs are also in same folder.
My configuration as follows:
-servlet.xml
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:mvc="http://www.springframework.org/schema/mvc"
xmlns:flow="http://www.springframework.org/schema/webflow-config"
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
http://www.springframework.org/schema/mvc
http://www.springframework.org/schema/mvc/spring-mvc-3.0.xsd
http://www.springframework.org/schema/webflow-config
http://www.springframework.org/schema/webflow-config/spring-webflow-config-2.0.xsd">
<mvc:annotation-driven/>
<context:component-scan base-package="com.controller.*"/>
<bean id="tilesViewResolver" class="org.springframework.web.servlet.view.tiles2.TilesViewResolver"/>
<bean id="tilesConfigurer" class="org.springframework.web.servlet.view.tiles2.TilesConfigurer">
<property name="definitions">
<list>
<value>/WEB-INF/tiles.xml</value>
</list>
</property>
</bean>
<flow:flow-executor id="flowExecutor" flow-registry="flowRegistry"/>
<flow:flow-registry id="flowRegistry">
<flow:flow-location path="/WEB-INF/flow/WebFlow.xml" id="flow"/>
</flow:flow-registry>
<bean id="flowHandlerMapping" class="org.springframework.webflow.mvc.servlet.FlowHandlerMapping">
<property name="flowRegistry" ref="flowRegistry"/>
</bean>
<bean id="flowHandlerAdapter" class="org.springframework.webflow.mvc.servlet.FlowHandlerAdapter">
<property name="flowExecutor" ref="flowExecutor"/>
</bean>
</beans>
WebFlow.xml
<flow xmlns="http://www.springframework.org/schema/webflow"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/webflow
http://www.springframework.org/schema/webflow/spring-webflow-2.0.xsd">
<var name="studentRegForm" class="com.formbean.flows.StudRegForm"/>
<view-state id="login" view="login">
<transition on="studentReg" to="studentReg"/>
</view-state>
<view-state id="studentReg" view="studentReg" model="studentRegForm">
<transition on="submitStudInfo" to="studConfirmPage"/>
</view-state>
<view-state id="studConfirmPage">
<transition on="submit" to="showStoredPage"/>
<transition on="Cancel" to="studentReg"/>
</view-state>
<end-state id="showStoredPage"/>
</flow>
login.jsp
<sf:form id="loginFrm" modelAttribute="loginForm" method="GET" action="${flowExecutionUrl}">
<input type="text" name="_flowExecutionKey" value="${flowExecutionKey}"/>
<input type="submit" value="Student Registration" name="_eventId_studentReg"/>
</sf:form>
StudentReg.jsp
<sf:form id="studRegFrm" modelAttribute="studentRegForm" method="GET" action="${flowExecutionUrl}">
<input type="text" name="_flowExecutionKey" value="${flowExecutionKey}"/>
<table>
<tr>
<td><sf:label path="name">Please Enter Name:</sf:label></td>
<td><sf:input path="name"/></td>
</tr>
<tr>
<td><sf:label path="address">Please Enter Address:</sf:label></td>
<td><sf:input path="address"/></td>
</tr>
<tr>
<td></td>
<td><input type="submit" name="_eventId_submitStudInfo" value="Submit"/></td>
</tr>
</table>
</sf:form>
tiles.xml
<tiles-definitions>
<definition name="mainLayout" template="/WEB-INF/jsp/layout/mainLayout.jsp">
<put-attribute name="Title" value=""/>
<put-attribute name="Header" value="/WEB-INF/jsp/layout/Header.jsp"/>
<put-attribute name="Body" value=""/>
<put-attribute name="Footer" value="/WEB-INF/jsp/layout/Footer.jsp"/>
</definition>
<definition name="login" extends="mainLayout">
<put-attribute name="Title" value="Start Page"></put-attribute>
<put-attribute name="Body" value="/WEB-INF/flow/login.jsp"/>
</definition>
<definition name="studentReg" extends="mainLayout">
<put-attribute name="Title" value="Registration Page"></put-attribute>
<put-attribute name="Body" value="/WEB-INF/flow/StudentReg.jsp"/>
</definition>
</tiles-definitions>
But whenever I am clicking on submit button of login.jsp, it gives ${flowExecutionUrl} & ${flowExecutionKey} as blank and next screen is not displaying. Am I missing some configuration or what's going wrong? Please help.
#Aasif your configuration 'looks' fine. SWF is notoriously un-intuitive to trouble shoot. Try inserting a logger into your flows like this:
Printing log from flow.xml
and determine where the the 'flow' execution is being interrupted. Once you isolate the location. Try to step into the flow code... I suspect an exception is being swallowed.
Possible Answer:
If I had to guess (even though your config looks correct). I would suspect SWF/tiles is NOT resolving the view name 'studentReg'. Try isolate this case by creating a separate flow and see if you can navigate to the view studentReg. You can also step into the Tiles resolver logic to make sure it is being located.
Also:
In my opinion, it is bad practice to give the same name to your viewStateId, transition, and viewName (i.e 'studentReg'). I think it makes trouble shooting more difficult when issues like this arise. Better to append a suffix to them. (i.e studentRegVsId, studentRegViewName, etc...) to create a distinction.

Get spring.profiles.active in Tiles.xml

Can we recover the active profile in tiles.xml?
I need to display an indicator in the title of the active profile.
web.xml
<context-param>
<param-name>spring.profiles.active</param-name>
<param-value>QA</param-value>
</context-param>
Tiles.xml
<definition name="base.layout" template="/WEB-INF/views/layout/layout.jsp">
<put-attribute name="title" value="My title - GET PROFILE ACTIVE HERE" />
<put-attribute name="header" value="/WEB-INF/views/layout/header.jsp" />
<put-attribute name="contentLayout" value="" />
<put-attribute name="footer" value="/WEB-INF/views/layout/footer.jsp" />
</definition>
Why don't you use app.properties as follows?
spring.profiles.active=QA
then in your xml you can use:
<util:properties id="app.properties" location="classpath:application.properties"/>
<definition name="base.layout" template="/WEB-INF/views/layout/layout.jsp">
<put-attribute name="title" value="${spring.profiles.active}"/>
...
</definition>

Tiles 2 with Spring MVC not resolving

I am trying to integrate Tiles 2 with Spring MVC but I am getting a specific jsp displayed rather than Tiles View. For ex, If request="about.htm" then I am getting about.jsp which is kept at /jsp/about.jsp . It works as if view is getting resolved through UrlBasedViewResolver.
My Spring-servlet.xml is
<mvc:annotation-driven />
<context:component-scan base-package="com.spring.controller" />
<mvc:resources mapping="/resources*" location="resources/"/>
<bean id="viewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="prefix" value="/WEB-INF/jsp/"/>
<property name="suffix" value=".jsp"/>
</bean>
<bean id="TilesViewResolver" class="org.springframework.web.servlet.view.ResourceBundleViewResolver" p:basename="views" />
<bean id="tilesConfigurer" class="org.springframework.web.servlet.view.tiles2.TilesConfigurer" p:definitions="/WEB-INF/tiles-defs.xml" />
<bean id="jdbcTemplate" class="org.springframework.jdbc.core.simple.SimpleJdbcTemplate">
<constructor-arg ref="dataSource"/>
</bean>
<bean id="loginDao" class="com.spring.dao.impl.LoginDaoImpl">
<property name="jdbcTemplate" ref="jdbcTemplate"/>
</bean>
views.properties kept under classes is
welcome.(class)=org.springframework.web.servlet.view.tiles2.TilesView
welcome.url=welcome
friends.(class)=org.springframework.web.servlet.view.tiles2.TilesView
friends.url=friends
office.(class)=org.springframework.web.servlet.view.tiles2.TilesView
office.url=office
about.(class)=org.springframework.web.servlet.view.JstlView
about.url=/jsp/about.jsp
tiles-defs.xml is
<tiles-definitions>
<definition name="baseLayout" template="/WEB-INF/tiles/baseLayout.jsp">
<put-attribute name="title" value="Template"/>
<put-attribute name="header" value="/WEB-INF/tiles/header.jsp"/>
<put-attribute name="menu" value="/WEB-INF/tiles/menu.jsp"/>
<put-attribute name="body" value="/WEB-INF/tiles/body.jsp"/>
<put-attribute name="footer" value="/WEB-INF/tiles/footer.jsp"/>
</definition>
<definition name="welcome" extends="baseLayout">
<put-attribute name="title" value="Welcome"/>
<put-attribute name="body" value="/jsp/welcome.jsp"/>
</definition>
<definition name="friends" extends="baseLayout">
<put-attribute name="title" value="Friends"/>
<put-attribute name="body" value="/jsp/friends.jsp"/>
</definition>
<definition name="office" extends="baseLayout">
<put-attribute name="title" value="Office"/>
<put-attribute name="body" value="/jsp/office.jsp"/>
</definition>
</tiles-definitions>
Please guide.
It could be a problem with the view resolver order, if you want to give priority to tiles view resolver then add order property for the view resolvers
<bean id="viewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="prefix" value="/WEB-INF/jsp/"/>
<property name="suffix" value=".jsp"/>
<property name="order" value="2"/>
</bean>
<bean id="TilesViewResolver" class="org.springframework.web.servlet.view.ResourceBundleViewResolver" p:basename="views" p:order="1"/>

How to automate body import with Apache Tiles and Spring MVC

I have the following tiles-def.xml:
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE tiles-definitions PUBLIC
"-//Apache Software Foundation//DTD Tiles Configuration 2.0//EN"
"http://tiles.apache.org/dtds/tiles-config_2_0.dtd">
<tiles-definitions>
<definition name="default" template="/WEB-INF/jsp/layout.jsp">
<put-attribute name="title" value="my webapp" />
<put-attribute name="header" value="/WEB-INF/jsp/header.jsp" />
<put-attribute name="menu" value="/WEB-INF/jsp/menu.jsp" />
<put-attribute name="body" value="/WEB-INF/jsp/hello.jsp" />
<put-attribute name="footer" value="/WEB-INF/jsp/footer.jsp" />
</definition>
<definition name="contact" extends="default">
<put-attribute name="body" value="/WEB-INF/jsp/contact.jsp" />
</definition>
<definition name="hello" extends="default">
<put-attribute name="body" value="/WEB-INF/jsp/hello.jsp" />
</definition>
</tiles-definitions>
As you can see, in all my pages, just the body changes. Is there a way to automate this? (so it automatically includes the jsp that has the name of the requested page, or an error page if it doesnt exist?)
Thank you!
EDIT: More details of what I want to do:
How it is now:
For each new page of my webapp, I have to add a new to my tiles-def.xml. And everytime, the only thing it does is setting the body with my content page.
What I would like to do:
Just have one default definition that automatically chose the page to display, something like this:
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE tiles-definitions PUBLIC
"-//Apache Software Foundation//DTD Tiles Configuration 2.0//EN"
"http://tiles.apache.org/dtds/tiles-config_2_0.dtd">
<tiles-definitions>
<definition name="default" template="/WEB-INF/jsp/layout.jsp">
<put-attribute name="title" value="my webapp" />
<put-attribute name="header" value="/WEB-INF/jsp/header.jsp" />
<put-attribute name="menu" value="/WEB-INF/jsp/menu.jsp" />
if(myPageName exists){
<put-attribute name="body" value="/WEB-INF/jsp/" + myPageName + ".jsp" />
else{
<put-attribute name="body" value="/WEB-INF/jsp/error404.jsp" />
}
<put-attribute name="footer" value="/WEB-INF/jsp/footer.jsp" />
</definition>
</tiles-definitions>
Where myPageName would be the name of the page requested (If the URL was "http://www.mysite.com/contact.html", then myPageName would be "contact". If it was "http://www.mysite.com/info.html", then myPageName would be "info").
How can I do this?
Check out the Dynamic Tiles Example on the springbyexample.org page. The DynamicTilesView does exactly what you want (see example config here). The full Dynamic Tiles Example can be found here on github

Resources