I have written simple search app using Tapestry 5.0.15. User query from text field is passed between requests via onPassivate and onActivate methods. Here is a page class source excerpt:
public class Index { private String _userQuery; private String _correctedQuery; @ApplicationState private NscopeDataSource _dataSource; ... private String getByteString(String str) { if(str == null || str.isEmpty()) return ""; String result = ""; try { byte[] bytes = str.getBytes("utf-8"); for(Byte b: bytes) result += Integer.toHexString(Math.abs(b.intValue())) + ", "; } catch (UnsupportedEncodingException ex) { } return result; } void onActivate(String aUserQuery) { this._userQuery = aUserQuery; if(_userQuery != null) System.out.println("--- MEMBER USER QUERY ACTIVATE: " + getByteString(_userQuery)); } Object onPassivate() { if(_userQuery != null) System.out.println("--- USER QUERY PASIVATE: " + getByteString(_userQuery)); return (Object)_userQuery; } public String getUserQuery() { return _userQuery; } public void setUserQuery(String aUserQuery) { this._userQuery = aUserQuery; } ... The problem is that _userQuery with diacritic characters are messed up. It looks like _userQuery is utf-encoded meny times. For query "miłość" (love in polish) this code produces following output in server log: [DEBUG] pages.Index Invoking: org.foo.searchapp.webclient.pages.Index.onPassivate() (at Index.java:67) --- USER QUERY PASIVATE: 6d, 69, 3b, 7e, 6f, 3b, 65, 3c, 79, [INFO] AppModule.TimingFilter Request time: 9 ms [DEBUG] pages.Index Dispatch event: ComponentEvent[activate from (self)] [DEBUG] pages.Index Invoking: org.foo.searchapp.webclient.pages.Index.onActivate(java.lang.String) (at Index.java:60) --- MEMBER USER QUERY ACTIVATE: 6d, 69, 3d, 7b, 3e, 7e, 6f, 3d, 7b, 3e, 65, 3d, 7c, 3e, 79, [DEBUG] pages.Index Dispatch event: ComponentEvent[passivate from (self)] [DEBUG] pages.Index Invoking: org.foo.searchapp.webclient.pages.Index.onPassivate() (at Index.java:67) --- USER QUERY PASIVATE: 6d, 69, 3d, 7b, 3e, 7e, 6f, 3d, 7b, 3e, 65, 3d, 7c, 3e, 79, [DEBUG] pages.Index Dispatch event: ComponentEvent[passivate from (self)] [DEBUG] pages.Index Invoking: org.foo.searchapp.webclient.pages.Index.onPassivate() (at Index.java:67) --- USER QUERY PASIVATE: 6d, 69, 3d, 7b, 3e, 7e, 6f, 3d, 7b, 3e, 65, 3d, 7c, 3e, 79, [DEBUG] pages.Index Dispatch event: ComponentEvent[passivate from (self)] [DEBUG] pages.Index Invoking: org.foo.searchapp.webclient.pages.Index.onPassivate() (at Index.java:67) --- USER QUERY PASIVATE: 6d, 69, 3d, 7b, 3e, 7e, 6f, 3d, 7b, 3e, 65, 3d, 7c, 3e, 79, [DEBUG] pages.Index Dispatch event: ComponentEvent[prepareForRender from searchForm] [DEBUG] pages.Index Dispatch event: ComponentEvent[prepare from searchForm] [DEBUG] pages.Index Dispatch event: ComponentEvent[passivate from (self)] [DEBUG] pages.Index Invoking: org.foo.searchapp.webclient.pages.Index.onPassivate() (at Index.java:67) --- USER QUERY PASIVATE: 6d, 69, 3d, 7b, 3e, 7e, 6f, 3d, 7b, 3e, 65, 3d, 7c, 3e, 79, [DEBUG] pages.Index Dispatch event: ComponentEvent[toClient from userQuery] [DEBUG] pages.Index Dispatch event: ComponentEvent[passivate from (self)] [DEBUG] pages.Index Invoking: org.foo.searchapp.webclient.pages.Index.onPassivate() (at Index.java:67) --- USER QUERY PASIVATE: 6d, 69, 3d, 7b, 3e, 7e, 6f, 3d, 7b, 3e, 65, 3d, 7c, 3e, 79, [DEBUG] pages.Index Dispatch event: ComponentEvent[passivate from (self)] [DEBUG] pages.Index Invoking: org.foo.searchapp.webclient.pages.Index.onPassivate() (at Index.java:67) --- USER QUERY PASIVATE: 6d, 69, 3d, 7b, 3e, 7e, 6f, 3d, 7b, 3e, 65, 3d, 7c, 3e, 79, [DEBUG] pages.Index Dispatch event: ComponentEvent[passivate from (self)] [DEBUG] pages.Index Invoking: org.foo.searchapp.webclient.pages.Index.onPassivate() (at Index.java:67) --- USER QUERY PASIVATE: 6d, 69, 3d, 7b, 3e, 7e, 6f, 3d, 7b, 3e, 65, 3d, 7c, 3e, 79, [DEBUG] pages.Index Dispatch event: ComponentEvent[passivate from (self)] [DEBUG] pages.Index Invoking: org.foo.searchapp.webclient.pages.Index.onPassivate() (at Index.java:67) --- USER QUERY PASIVATE: 6d, 69, 3d, 7b, 3e, 7e, 6f, 3d, 7b, 3e, 65, 3d, 7c, 3e, 79, [DEBUG] pages.Index Dispatch event: ComponentEvent[passivate from (self)] [DEBUG] pages.Index Invoking: org.foo.searchapp.webclient.pages.Index.onPassivate() (at Index.java:67) --- USER QUERY PASIVATE: 6d, 69, 3d, 7b, 3e, 7e, 6f, 3d, 7b, 3e, 65, 3d, 7c, 3e, 79, [DEBUG] pages.Index Dispatch event: ComponentEvent[passivate from (self)] [DEBUG] pages.Index Invoking: org.foo.searchapp.webclient.pages.Index.onPassivate() (at Index.java:67) --- USER QUERY PASIVATE: 6d, 69, 3d, 7b, 3e, 7e, 6f, 3d, 7b, 3e, 65, 3d, 7c, 3e, 79, [DEBUG] pages.Index Dispatch event: ComponentEvent[passivate from (self)] [DEBUG] pages.Index Invoking: org.foo.searchapp.webclient.pages.Index.onPassivate() (at Index.java:67) --- USER QUERY PASIVATE: 6d, 69, 3d, 7b, 3e, 7e, 6f, 3d, 7b, 3e, 65, 3d, 7c, 3e, 79, [DEBUG] pages.Index Dispatch event: ComponentEvent[passivate from (self)] [DEBUG] pages.Index Invoking: org.foo.searchapp.webclient.pages.Index.onPassivate() (at Index.java:67) --- USER QUERY PASIVATE: 6d, 69, 3d, 7b, 3e, 7e, 6f, 3d, 7b, 3e, 65, 3d, 7c, 3e, 79, [DEBUG] pages.Index Dispatch event: ComponentEvent[passivate from (self)] [DEBUG] pages.Index Invoking: org.foo.searchapp.webclient.pages.Index.onPassivate() (at Index.java:67) --- USER QUERY PASIVATE: 6d, 69, 3d, 7b, 3e, 7e, 6f, 3d, 7b, 3e, 65, 3d, 7c, 3e, 79, [DEBUG] pages.Index Dispatch event: ComponentEvent[passivate from (self)] [DEBUG] pages.Index Invoking: org.foo.searchapp.webclient.pages.Index.onPassivate() (at Index.java:67) --- USER QUERY PASIVATE: 6d, 69, 3d, 7b, 3e, 7e, 6f, 3d, 7b, 3e, 65, 3d, 7c, 3e, 79, [DEBUG] pages.Index Dispatch event: ComponentEvent[passivate from (self)] [DEBUG] pages.Index Invoking: org.foo.searchapp.webclient.pages.Index.onPassivate() (at Index.java:67) --- USER QUERY PASIVATE: 6d, 69, 3d, 7b, 3e, 7e, 6f, 3d, 7b, 3e, 65, 3d, 7c, 3e, 79, [DEBUG] pages.Index Dispatch event: ComponentEvent[passivate from (self)] [DEBUG] pages.Index Invoking: org.foo.searchapp.webclient.pages.Index.onPassivate() (at Index.java:67) --- USER QUERY PASIVATE: 6d, 69, 3d, 7b, 3e, 7e, 6f, 3d, 7b, 3e, 65, 3d, 7c, 3e, 79, [DEBUG] pages.Index Dispatch event: ComponentEvent[passivate from (self)] [DEBUG] pages.Index Invoking: org.foo.searchapp.webclient.pages.Index.onPassivate() (at Index.java:67) --- USER QUERY PASIVATE: 6d, 69, 3d, 7b, 3e, 7e, 6f, 3d, 7b, 3e, 65, 3d, 7c, 3e, 79, [DEBUG] pages.Index Dispatch event: ComponentEvent[passivate from (self)] [DEBUG] pages.Index Invoking: org.foo.searchapp.webclient.pages.Index.onPassivate() (at Index.java:67) --- USER QUERY PASIVATE: 6d, 69, 3d, 7b, 3e, 7e, 6f, 3d, 7b, 3e, 65, 3d, 7c, 3e, 79, [DEBUG] pages.Index Dispatch event: ComponentEvent[passivate from (self)] [DEBUG] pages.Index Invoking: org.foo.searchapp.webclient.pages.Index.onPassivate() (at Index.java:67) --- USER QUERY PASIVATE: 6d, 69, 3d, 7b, 3e, 7e, 6f, 3d, 7b, 3e, 65, 3d, 7c, 3e, 79, [DEBUG] pages.Index Dispatch event: ComponentEvent[passivate from (self)] [DEBUG] pages.Index Invoking: org.foo.searchapp.webclient.pages.Index.onPassivate() (at Index.java:67) --- USER QUERY PASIVATE: 6d, 69, 3d, 7b, 3e, 7e, 6f, 3d, 7b, 3e, 65, 3d, 7c, 3e, 79, [DEBUG] pages.Index Dispatch event: ComponentEvent[passivate from (self)] [DEBUG] pages.Index Invoking: org.foo.searchapp.webclient.pages.Index.onPassivate() (at Index.java:67) --- USER QUERY PASIVATE: 6d, 69, 3d, 7b, 3e, 7e, 6f, 3d, 7b, 3e, 65, 3d, 7c, 3e, 79, [DEBUG] pages.Index Dispatch event: ComponentEvent[passivate from (self)] [DEBUG] pages.Index Invoking: org.foo.searchapp.webclient.pages.Index.onPassivate() (at Index.java:67) --- USER QUERY PASIVATE: 6d, 69, 3d, 7b, 3e, 7e, 6f, 3d, 7b, 3e, 65, 3d, 7c, 3e, 79, [DEBUG] pages.Index Dispatch event: ComponentEvent[passivate from (self)] [DEBUG] pages.Index Invoking: org.foo.searchapp.webclient.pages.Index.onPassivate() (at Index.java:67) --- USER QUERY PASIVATE: 6d, 69, 3d, 7b, 3e, 7e, 6f, 3d, 7b, 3e, 65, 3d, 7c, 3e, 79, [DEBUG] pages.Index Dispatch event: ComponentEvent[passivate from (self)] [DEBUG] pages.Index Invoking: org.foo.searchapp.webclient.pages.Index.onPassivate() (at Index.java:67) --- USER QUERY PASIVATE: 6d, 69, 3d, 7b, 3e, 7e, 6f, 3d, 7b, 3e, 65, 3d, 7c, 3e, 79, [DEBUG] pages.Index Dispatch event: ComponentEvent[passivate from (self)] [DEBUG] pages.Index Invoking: org.foo.searchapp.webclient.pages.Index.onPassivate() (at Index.java:67) --- USER QUERY PASIVATE: 6d, 69, 3d, 7b, 3e, 7e, 6f, 3d, 7b, 3e, 65, 3d, 7c, 3e, 79, [DEBUG] pages.Index Dispatch event: ComponentEvent[passivate from (self)] [DEBUG] pages.Index Invoking: org.foo.searchapp.webclient.pages.Index.onPassivate() (at Index.java:67) --- USER QUERY PASIVATE: 6d, 69, 3d, 7b, 3e, 7e, 6f, 3d, 7b, 3e, 65, 3d, 7c, 3e, 79, [DEBUG] pages.Index Dispatch event: ComponentEvent[passivate from (self)] [DEBUG] pages.Index Invoking: org.foo.searchapp.webclient.pages.Index.onPassivate() (at Index.java:67) --- USER QUERY PASIVATE: 6d, 69, 3d, 7b, 3e, 7e, 6f, 3d, 7b, 3e, 65, 3d, 7c, 3e, 79, [DEBUG] pages.Index Executed 2,816 rendering commands (max queue depth: 99) in 0.914 seconds [INFO] AppModule.TimingFilter Request time: 922 ms [INFO] AppModule.TimingFilter Request time: 0 ms [INFO] AppModule.TimingFilter Request time: 8 ms [INFO] AppModule.TimingFilter Request time: 0 ms [INFO] AppModule.TimingFilter Request time: 1 ms [INFO] AppModule.TimingFilter Request time: 3 ms [INFO] AppModule.TimingFilter Request time: 0 ms When onPassivate method is called for the first time all characters are ok, but in the subsequent onActivate it's not. I don't know Tapestry very well yet, so my another question is why onPassivate is called so many times? BTW: if _userQuery is passed via persistent member (@Persist) everything is ok. But it will not work for me. This problem occured when I deployed app on linux server. On Windows everything works fine. Application source and output encoding is set to UTF-8. thanks in advance for any help. Shymon -- View this message in context: http://www.nabble.com/String-encoding-in-activation-context-tp20075742p20075742.html Sent from the Tapestry - User mailing list archive at Nabble.com. --------------------------------------------------------------------- To unsubscribe, e-mail: [EMAIL PROTECTED] For additional commands, e-mail: [EMAIL PROTECTED]