[ 
https://issues.apache.org/jira/browse/WICKET-3972?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=13087197#comment-13087197
 ] 

Juergen Donnerstag commented on WICKET-3972:
--------------------------------------------

I don't think your observations are completely right. *Handlers are executed 
while loading the markup and before the markup gets cached. They get re-used 
for multiple instances of typically (but necessarily) the same Components. The 
Page instance is not known. The main purpose of *Handlers are to identify tags 
which Wicket's render process must somehow handle.

*Resolvers are used during the render process to automatically create (or 
find/resolve) components which know how to handle the tag. Many *Resolvers 
create auto-components, which are typically transparent, and which are 
automatically removed again after the render process. They get re-created with 
the next render cycle. The Page is known during the render process. And because 
the page auto-index gets incremented, it should never happen that for the same 
page instance components with the same id are created.  I don't think we need 
some other mechanism. A *Resolver should never change the tag id, only the 
*Handler may.

The solution is much simpler. WicketMessageTagHandler.resolver() should not 
call tag.setId()




> wicket:message attribute results in "The component was rendered already" error
> ------------------------------------------------------------------------------
>
>                 Key: WICKET-3972
>                 URL: https://issues.apache.org/jira/browse/WICKET-3972
>             Project: Wicket
>          Issue Type: Bug
>          Components: wicket-core
>    Affects Versions: 1.5-RC5.1
>         Environment: Linux Ubuntu, Tomcat 6, Java 6
>            Reporter: Sergiy Barlabanov
>            Assignee: Peter Ertl
>         Attachments: auto-index-inside-markup.patch, quickstart.zip
>
>
> Seems like there is a problem with generation of tag and component IDs when 
> using wicket:message as an attribute for tags inside ListView.
> The quickstart webapp is attached to this ticket. There are two pages in this 
> webapp: HomePage with a ListView containing tags with wicket:message 
> attribute and two tags with wicket:message attribute outside the ListView. If 
> a user goes to the next page (SecondPage) using the link on HomePage and then 
> goes back to HomePage using the link on SecondPage, the exception mentioned 
> in the subject occurs.
> Seems that the ID generation for tags and components is wrong: the 
> ComponentTag-s are cached together with the corresponding Markup and then 
> reused for later renderings. But the problem is, that those ComponentTag-s 
> are mutable (at least in case of tags with wicket:message attribute) and 
> their IDs are changed on every rendering and this produces ID conflicts when 
> MarkupContainer.renderNext tries to find or create components corresponding 
> to the tags.
> Interesting is, that we can reproduce this bug only in DEVELOPMENT mode. In 
> DEPLOYMENT mode everything seems to work. The solution would be to make 
> ComponentTags immutable and do not allow to change them, but to create copies 
> (there is mutable method in ComponentTag, which is used in some cases).

--
This message is automatically generated by JIRA.
For more information on JIRA, see: http://www.atlassian.com/software/jira

        

Reply via email to