Attribute not found:NoSuchAttributeException in tiles with Spring

梦想的初衷 提交于 2019-12-02 12:14:45

问题


I searched for all the questions asked on this site and tried all the changes but no luck. So posting the query here:

I am getting following exception:

HTTP Status 500 - org.apache.tiles.template.NoSuchAttributeException: Attribute 'body' not found.

type Exception report

message org.apache.tiles.template.NoSuchAttributeException: Attribute 'body' not found.

description The server encountered an internal error that prevented it from fulfilling this request.

exception

org.apache.jasper.JasperException: org.apache.tiles.template.NoSuchAttributeException: Attribute 'body' not found.
    org.apache.jasper.servlet.JspServletWrapper.handleJspException(JspServletWrapper.java:549)
    org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:470)
    org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:390)
    org.apache.jasper.servlet.JspServlet.service(JspServlet.java:334)
    javax.servlet.http.HttpServlet.service(HttpServlet.java:728)
    org.springframework.web.servlet.view.InternalResourceView.renderMergedOutputModel(InternalResourceView.java:238)
    org.springframework.web.servlet.view.AbstractView.render(AbstractView.java:262)
    org.springframework.web.servlet.DispatcherServlet.render(DispatcherServlet.java:1180)
    org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:950)
    org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:852)
    org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:882)
    org.springframework.web.servlet.FrameworkServlet.doPost(FrameworkServlet.java:789)
    javax.servlet.http.HttpServlet.service(HttpServlet.java:647)
    javax.servlet.http.HttpServlet.service(HttpServlet.java:728)

root cause

org.apache.tiles.template.NoSuchAttributeException: Attribute 'body' not found.
    org.apache.tiles.template.DefaultAttributeResolver.computeAttribute(DefaultAttributeResolver.java:49)
    org.apache.tiles.template.InsertAttributeModel.resolveAttribute(InsertAttributeModel.java:187)
    org.apache.tiles.template.InsertAttributeModel.start(InsertAttributeModel.java:107)
    org.apache.tiles.jsp.taglib.InsertAttributeTag.doTag(InsertAttributeTag.java:306)
    org.apache.jsp.WEB_002dINF.views.home_jsp._jspx_meth_tiles_005finsertAttribute_005f0(home_jsp.java:146)
    org.apache.jsp.WEB_002dINF.views.home_jsp._jspService(home_jsp.java:79)
    org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:70)
    javax.servlet.http.HttpServlet.service(HttpServlet.java:728)
    org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:432)
    org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:390)
    org.apache.jasper.servlet.JspServlet.service(JspServlet.java:334)
    javax.servlet.http.HttpServlet.service(HttpServlet.java:728)
    org.springframework.web.servlet.view.InternalResourceView.renderMergedOutputModel(InternalResourceView.java:238)
    org.springframework.web.servlet.view.AbstractView.render(AbstractView.java:262)
    org.springframework.web.servlet.DispatcherServlet.render(DispatcherServlet.java:1180)
    org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:950)
    org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:852)
    org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:882)
    org.springframework.web.servlet.FrameworkServlet.doPost(FrameworkServlet.java:789)
    javax.servlet.http.HttpServlet.service(HttpServlet.java:647)
    javax.servlet.http.HttpServlet.service(HttpServlet.java:728)

note The full stack trace of the root cause is available in the Apache Tomcat/7.0.35 logs.
Apache Tomcat/7.0.35 

I have my tiles.xml as:

<tiles-definitions>
  <definition name="base.definition" template="/WEB-INF/views/home.jsp">
         <put-attribute name="body" value="/WEB-INF/views/menu.jsp" />
  </definition>
</tiles-definitions>

And finally my servlet-context.xml has following entries:

<beans:bean id="tilesViewResolver" class="org.springframework.web.servlet.view.UrlBasedViewResolver">
        <beans:property name="viewClass" value="org.springframework.web.servlet.view.tiles2.TilesView"/>
    </beans:bean>

    <!-- 
    <beans:bean id="viewResolver" 
    class="org.springframework.web.servlet.view.UrlBasedViewResolver">
    <beans:property name="viewClass">
        <beans:value>
            org.springframework.web.servlet.view.tiles2.TilesView
        </beans:value>
    </beans:property>
    </beans:bean>
 -->
    <beans:bean id="tilesConfigurer" 
    class="org.springframework.web.servlet.view.tiles2.TilesConfigurer">
    <beans:property name="definitions">
        <beans:list>
            <beans:value>/WEB-INF/tiles.xml</beans:value>
        </beans:list>
    </beans:property>
    </beans:bean>

There is some commented part because I tried this answer from previously posted question but same problem occurred.

My POM.xml has following entries.(Just to be sure)

           <dependency>
        <groupId>org.apache.tiles</groupId>
        <artifactId>tiles-core</artifactId>
        <version>2.2.2</version>
        <type>jar</type>
        <scope>compile</scope>
    </dependency>
    <dependency>
        <groupId>org.apache.tiles</groupId>
        <artifactId>tiles-template</artifactId>
        <version>2.2.2</version>
        <type>jar</type>
        <scope>compile</scope>
    </dependency>

    <dependency>
        <groupId>org.apache.tiles</groupId>
        <artifactId>tiles-jsp</artifactId>
        <version>2.2.2</version>
        <type>jar</type>
        <scope>compile</scope>
    </dependency>

    <dependency>
        <groupId>org.apache.tiles</groupId>
        <artifactId>tiles-servlet</artifactId>
        <version>2.2.2</version>
        <type>jar</type>
        <scope>compile</scope>
    </dependency>

I have this code in my home.jsp as:

<tiles:insertAttribute name="body" />

And my menu.jsp is:

<ul>
<li><a href="search.htm">Search</a></li>
<li><a href="showMessages.htm">Messages</a></li>
<li><a href="contacts.htm">My Contacts</a></li>
<li><a href="change.htm">Password</a></li>
<li><a href="logout.htm">Logout</a></li>
</ul>

Please help. If anything else is needed, please ask. thanks in advance.


回答1:


I found the answer after few changes in the tiles.xml

The main problem with it is that you can not use the definition directly. You have to extend it and then you can use it.

Refer this my edited code:

<definition name="new.definition" template="/WEB-INF/layout/newlayout.jsp"> 
<put-attribute name="title" value="" /> 
<put-attribute name="body" value="" /> 
<put-attribute name="menu" value="" /> 
</definition> 

<definition name="choice" extends="new.definition"> 
<put-attribute name="title" value="" /> 
<put-attribute name="body" value="/WEB-INF/views/choice.jsp" /> 
<put-attribute name="menu" value="" /> 
<put-attribute name="right" value="" /> 
    </definition> 

<definition name="logout" extends="new.definition"> 
<put-attribute name="title" value="Logging out.." />
 <put-attribute name="body" value="/WEB-INF/views/logout.jsp" />
 <put-attribute name="menu" value="" /> 
<put-attribute name="right" value="" /> 
</definition> 

As you can see, I initially created new definition as "new.definition" and then for choice and logout I am extending the existing definition.



来源:https://stackoverflow.com/questions/15752519/attribute-not-foundnosuchattributeexception-in-tiles-with-spring

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!