You are viewing a plain text version of this content. The canonical link for it is here.
Posted to users@wicket.apache.org by leejoyprakash <le...@gmail.com> on 2015/11/17 11:20:12 UTC

Error: Not detached model found

I am getting the following error while working with Wicket 6.19:

 Caused by:
org.apache.wicket.core.util.objects.checker.CheckingObjectOutputStream$ObjectCheckException:
Not detached model found!
	A problem occurred while checking object with type:
com.test.web.components.CurrentUserModel
	Field hierarchy is:
	   [class=com.test.web.base.pages.HomePage, path=0]
		private java.lang.Object org.apache.wicket.MarkupContainer.children
[class=[Ljava.lang.Object;]
		  java.lang.Object org.apache.wicket.Component.data[1]
[class=com.test.web.HeaderPanel, path=0:headerPanel]
			private java.lang.Object org.apache.wicket.MarkupContainer.children
[class=[Ljava.lang.Object;]
			  private java.lang.String
org.apache.wicket.markup.html.image.resource.LocalizedImageResource.variation[2]
[class=com.test.web.LoginStatusPanel, path=0:headerPanel:loginStatusPanel]
				java.lang.Object org.apache.wicket.Component.data
[class=com.test.web.components.CurrentUserModel] <----- field that is
causing the problem
			
Code:

	@RequireHttps
	public class HomePage extends WebPage {
		private HeaderPanel headerPanel;
		private LoginStatusPanel loginStatusPanel;
		private MenuPanel menuPanel;
		
		public HomePage(String id) {
			super();
			initialize();
		}

		public HomePage(String id, PageParameters parameters) {
			super(parameters);
			initialize();
		}

		@Override
		protected void onInitialize() {
			Request request = RequestCycle.get().getRequest();
			if (request instanceof ServletWebRequest)
			{
				ServletWebRequest wr = (ServletWebRequest) request;
				HttpSession session = wr.getContainerRequest().getSession();
				if (session != null) {
				}
			}
			super.onInitialize();
		}
		
		public String getApplicationId(){
			return applicationId;
		}
		
		private void initialize() {
			add(headerPanel = new HeaderPanel("headerPanel"));
			headerPanel.add(loginStatusPanel = new
LoginStatusPanel("loginStatusPanel"));
			headerPanel.add(menuPanel = new MenuPanel("menuPanel"));
		}
	}

	public class HeaderPanel extends Panel {
		private Label headerTitleLbl;
		
		public HeaderPanel(String id) {
			super(id);
			add(headerTitleLbl=new Label("headerTitle",
WebApplication.getAppTitle()));
			headerTitleLbl.setOutputMarkupId(true);
		}
	}

	public class LoginStatusPanel extends Panel {
				
		public LoginStatusPanel(String id) {
			super(id, new CurrentUserModel()); // Line 1
		}
		
		protected void onInitialize() {
			IModel<Authentication> authModel = (IModel<Authentication>)
getDefaultModel();
			final Authentication auth = authModel.getObject();
			
			if (auth != null && auth.isAuthenticated() && !(auth instanceof
AnonymousAuthenticationToken))
			{
				Fragment fragment = new Fragment("frag", "loggedInFragment", this);
				Label status;
				fragment.add(status = new Label("status", "Logged in as "));
				fragment.add(new Label("userId", new PropertyModel<String>(authModel,
"name")));
				add(fragment);
			}
			else
			{
				Fragment fragment = new Fragment("frag", "loggedOutFragment", this);
				fragment.add(new Label("status", "Logged out"));
				fragment.add(new ExternalLink("login", "/LoginPage", "Log In"));
				add(fragment);
			}
			super.onInitialize();
		}
	}

	public class MenuPanel extends Panel {
		public MenuPanel(String id) {
			super(id);
			add(new MenuPanel("menu", WebApplication.getMenuList()));
		}
	}

	public class CurrentUserModel extends
LoadableDetachableModel<Authentication> {
		protected Authentication load() {
			return SecurityContextHolder.getContext().getAuthentication();
		}
	}

Note: If I update the code in comment marked as 'Line 1' with the following:

    super(id, new
Model(SecurityContextHolder.getContext().getAuthentication()));

The error doesn't show up, that might be because its not a
LoadableDetachableModel.

Is it possible to pass an instance of LoadableDetachableModel to Component
class constructor? 

I am getting the same error for the following code as well:

    tree = new NestedTree<TreeItem>("tree", provider, state);

Where state is an instance of the following class:

    private class TreeItemExpansionModel extends
LoadableDetachableModel<Set&lt;TreeItem>>
    {
		private static final long serialVersionUID = 1L;
		private final String treePanelId;
		
		public TreeItemExpansionModel(String treePanelId) {
			this.treePanelId = treePanelId;
		}

		@Override
		protected Set<TreeItem> load() {
			return TreeItemExpansion.get(treePanelId);
		}
		
		@Override
		public boolean equals(Object obj) {
			if (obj instanceof TreeItemExpansionModel) {
				return ((TreeItemExpansionModel) obj).treePanelId.equals(treePanelId);
			}
			return false;
		}

		@Override
		public int hashCode() {
			return treePanelId.hashCode();
		}
    }

And the error is as follows:

	Caused by:
org.apache.wicket.core.util.objects.checker.CheckingObjectOutputStream$ObjectCheckException:
Not detached model found!
	A problem occurred while checking object with type:
com.test.web.components.TreeItemProvider$TreeItemModel
	Field hierarchy is:
	   [class=com.test.web.admin.pages.HomePage, path=0]
		private java.lang.Object org.apache.wicket.MarkupContainer.children
[class=[Ljava.lang.Object;]
		  java.util.List com.test.web.components.WhistlePanel.selectionList[2]
[class=com.test.web.NavPanel, path=0:navPanel]
			private java.lang.Object org.apache.wicket.MarkupContainer.children
[class=org.apache.wicket.extensions.markup.html.repeater.tree.NestedTree,
path=0:navPanel:tree]
			  private java.lang.Object org.apache.wicket.MarkupContainer.children
[class=org.apache.wicket.extensions.markup.html.repeater.tree.nested.Subtree,
path=0:navPanel:tree:subtree]
				private java.lang.Object org.apache.wicket.MarkupContainer.children
[class=org.apache.wicket.markup.repeater.RefreshingView,
path=0:navPanel:tree:subtree:branches]
				  private java.lang.Object org.apache.wicket.MarkupContainer.children
[class=[Ljava.lang.Object;]
					private java.lang.Object org.apache.wicket.MarkupContainer.children[0]
[class=org.apache.wicket.extensions.markup.html.repeater.tree.nested.BranchItem,
path=0:navPanel:tree:subtree:branches:1]
					  java.lang.Object org.apache.wicket.Component.data
[class=com.test.web.components.TreeItemProvider$TreeItemModel] <----- field
that is causing the problem

Thanks in advance.

--
View this message in context: http://apache-wicket.1842946.n4.nabble.com/Error-Not-detached-model-found-tp4672624.html
Sent from the Users forum mailing list archive at Nabble.com.

---------------------------------------------------------------------
To unsubscribe, e-mail: users-unsubscribe@wicket.apache.org
For additional commands, e-mail: users-help@wicket.apache.org


Re: Error: Not detached model found

Posted by leejoyprakash <le...@gmail.com>.
Thanks Sven, it worked ... 

--
View this message in context: http://apache-wicket.1842946.n4.nabble.com/Error-Not-detached-model-found-tp4672624p4672642.html
Sent from the Users forum mailing list archive at Nabble.com.

---------------------------------------------------------------------
To unsubscribe, e-mail: users-unsubscribe@wicket.apache.org
For additional commands, e-mail: users-help@wicket.apache.org


Re: Error: Not detached model found

Posted by Sven Meier <sv...@meiers.net>.
Hi,

WicketTester detaches the tested page *after* each request.

Have you tried checking serialization after executing the Ajax event?

@Override
public void executeAjaxEvent(final Component component, final String event)
{
     super.executeAjaxEvent(component, event);
     serializationChecker();
}

Regards
Sven



On 17.11.2015 18:42, leejoyprakash wrote:
> Hello Sven,
>
> This error is thrown in my test case. I think my basic understanding about
> the way wicket works is wrong.
>
> In my CustomerWicketTester class(which inherits from WicketTester), I have
> overridden the method as follows:
>
> @Override
> public void executeAjaxEvent(final Component component, final String event)
> {
> 	serializationChecker();
> 	super.executeAjaxEvent(component, event);
> }
>
> So from my test case while calling 'wicketTester.clickTreeNode("Users");'
> which intern calls executeAjaxEvent throws the above error.
>
> Following is my custom JavaSerializer class and the method which uses it:
>
> public void serializationChecker(){
> 	javaSerializer.serialize(getLastRenderedPage());
> }
>
> private class CustomJavaSerializer extends JavaSerializer {
>
> 	private final String appKey;
> 	public CustomJavaSerializer(String applicationKey) {
> 		super(applicationKey);
> 		this.appKey = applicationKey;
> 	}
> 		
> 	@Override
> 	protected ObjectOutputStream newObjectOutputStream(OutputStream out) throws
> IOException {
> 	        IObjectChecker checker = new NotDetachedModelChecker();
> 	        IObjectChecker checker2 = new
> SerializableChecker.ObjectSerializationChecker();
> 	        return new CheckingObjectOutputStream(out, checker, checker2);
> 	 }
>
> 	@Override
> 	public byte[] serialize(Object object) throws WicketRuntimeException {
> 	try
> 	{
> 		final ByteArrayOutputStream out = new ByteArrayOutputStream();
> 		ObjectOutputStream oos = null;
> 		try
> 		{
> 			oos = newObjectOutputStream(out);
> 			oos.writeObject(appKey);
> 			oos.writeObject(object);
> 		}
> 		finally
> 		{
> 			try
> 			{
> 				IOUtils.close(oos);
> 			}
> 			finally
> 			{
> 				out.close();
> 			}
> 		}
> 		return out.toByteArray();
> 	}
> 	catch (Exception e)
> 	{
> 		throw new WicketRuntimeException("Error serializing object " +
> object.getClass() + " [object=" + object + "]", e);
> 	}
>      }
> }
>
>
> --
> View this message in context: http://apache-wicket.1842946.n4.nabble.com/Error-Not-detached-model-found-tp4672624p4672632.html
> Sent from the Users forum mailing list archive at Nabble.com.
>
> ---------------------------------------------------------------------
> To unsubscribe, e-mail: users-unsubscribe@wicket.apache.org
> For additional commands, e-mail: users-help@wicket.apache.org
>

---------------------------------------------------------------------
To unsubscribe, e-mail: users-unsubscribe@wicket.apache.org
For additional commands, e-mail: users-help@wicket.apache.org


Re: Error: Not detached model found

Posted by leejoyprakash <le...@gmail.com>.
Hello Sven,

This error is thrown in my test case. I think my basic understanding about
the way wicket works is wrong.

In my CustomerWicketTester class(which inherits from WicketTester), I have
overridden the method as follows:

@Override
public void executeAjaxEvent(final Component component, final String event)
{
	serializationChecker();
	super.executeAjaxEvent(component, event);
}

So from my test case while calling 'wicketTester.clickTreeNode("Users");'
which intern calls executeAjaxEvent throws the above error.

Following is my custom JavaSerializer class and the method which uses it:

public void serializationChecker(){
	javaSerializer.serialize(getLastRenderedPage());
}

private class CustomJavaSerializer extends JavaSerializer {

	private final String appKey;
	public CustomJavaSerializer(String applicationKey) {
		super(applicationKey);
		this.appKey = applicationKey;
	}
		
	@Override
	protected ObjectOutputStream newObjectOutputStream(OutputStream out) throws
IOException {
	        IObjectChecker checker = new NotDetachedModelChecker();
	        IObjectChecker checker2 = new
SerializableChecker.ObjectSerializationChecker();
	        return new CheckingObjectOutputStream(out, checker, checker2);
	 }

	@Override
	public byte[] serialize(Object object) throws WicketRuntimeException {
	try
	{
		final ByteArrayOutputStream out = new ByteArrayOutputStream();
		ObjectOutputStream oos = null;
		try
		{
			oos = newObjectOutputStream(out);
			oos.writeObject(appKey);
			oos.writeObject(object);
		}
		finally
		{
			try
			{
				IOUtils.close(oos);
			}
			finally
			{
				out.close();
			}
		}
		return out.toByteArray();
	}
	catch (Exception e)
	{
		throw new WicketRuntimeException("Error serializing object " +
object.getClass() + " [object=" + object + "]", e);
	}
    }
}


--
View this message in context: http://apache-wicket.1842946.n4.nabble.com/Error-Not-detached-model-found-tp4672624p4672632.html
Sent from the Users forum mailing list archive at Nabble.com.

---------------------------------------------------------------------
To unsubscribe, e-mail: users-unsubscribe@wicket.apache.org
For additional commands, e-mail: users-help@wicket.apache.org


Re: Error: Not detached model found

Posted by Sven Meier <sv...@meiers.net>.
Hi,

can you create a quickstart? It's very difficult to spot the cause of 
this problem in your code.

Regards
Sven


On 17.11.2015 11:20, leejoyprakash wrote:
> I am getting the following error while working with Wicket 6.19:
>
>   Caused by:
> org.apache.wicket.core.util.objects.checker.CheckingObjectOutputStream$ObjectCheckException:
> Not detached model found!
> 	A problem occurred while checking object with type:
> com.test.web.components.CurrentUserModel
> 	Field hierarchy is:
> 	   [class=com.test.web.base.pages.HomePage, path=0]
> 		private java.lang.Object org.apache.wicket.MarkupContainer.children
> [class=[Ljava.lang.Object;]
> 		  java.lang.Object org.apache.wicket.Component.data[1]
> [class=com.test.web.HeaderPanel, path=0:headerPanel]
> 			private java.lang.Object org.apache.wicket.MarkupContainer.children
> [class=[Ljava.lang.Object;]
> 			  private java.lang.String
> org.apache.wicket.markup.html.image.resource.LocalizedImageResource.variation[2]
> [class=com.test.web.LoginStatusPanel, path=0:headerPanel:loginStatusPanel]
> 				java.lang.Object org.apache.wicket.Component.data
> [class=com.test.web.components.CurrentUserModel] <----- field that is
> causing the problem
> 			
> Code:
>
> 	@RequireHttps
> 	public class HomePage extends WebPage {
> 		private HeaderPanel headerPanel;
> 		private LoginStatusPanel loginStatusPanel;
> 		private MenuPanel menuPanel;
> 		
> 		public HomePage(String id) {
> 			super();
> 			initialize();
> 		}
>
> 		public HomePage(String id, PageParameters parameters) {
> 			super(parameters);
> 			initialize();
> 		}
>
> 		@Override
> 		protected void onInitialize() {
> 			Request request = RequestCycle.get().getRequest();
> 			if (request instanceof ServletWebRequest)
> 			{
> 				ServletWebRequest wr = (ServletWebRequest) request;
> 				HttpSession session = wr.getContainerRequest().getSession();
> 				if (session != null) {
> 				}
> 			}
> 			super.onInitialize();
> 		}
> 		
> 		public String getApplicationId(){
> 			return applicationId;
> 		}
> 		
> 		private void initialize() {
> 			add(headerPanel = new HeaderPanel("headerPanel"));
> 			headerPanel.add(loginStatusPanel = new
> LoginStatusPanel("loginStatusPanel"));
> 			headerPanel.add(menuPanel = new MenuPanel("menuPanel"));
> 		}
> 	}
>
> 	public class HeaderPanel extends Panel {
> 		private Label headerTitleLbl;
> 		
> 		public HeaderPanel(String id) {
> 			super(id);
> 			add(headerTitleLbl=new Label("headerTitle",
> WebApplication.getAppTitle()));
> 			headerTitleLbl.setOutputMarkupId(true);
> 		}
> 	}
>
> 	public class LoginStatusPanel extends Panel {
> 				
> 		public LoginStatusPanel(String id) {
> 			super(id, new CurrentUserModel()); // Line 1
> 		}
> 		
> 		protected void onInitialize() {
> 			IModel<Authentication> authModel = (IModel<Authentication>)
> getDefaultModel();
> 			final Authentication auth = authModel.getObject();
> 			
> 			if (auth != null && auth.isAuthenticated() && !(auth instanceof
> AnonymousAuthenticationToken))
> 			{
> 				Fragment fragment = new Fragment("frag", "loggedInFragment", this);
> 				Label status;
> 				fragment.add(status = new Label("status", "Logged in as "));
> 				fragment.add(new Label("userId", new PropertyModel<String>(authModel,
> "name")));
> 				add(fragment);
> 			}
> 			else
> 			{
> 				Fragment fragment = new Fragment("frag", "loggedOutFragment", this);
> 				fragment.add(new Label("status", "Logged out"));
> 				fragment.add(new ExternalLink("login", "/LoginPage", "Log In"));
> 				add(fragment);
> 			}
> 			super.onInitialize();
> 		}
> 	}
>
> 	public class MenuPanel extends Panel {
> 		public MenuPanel(String id) {
> 			super(id);
> 			add(new MenuPanel("menu", WebApplication.getMenuList()));
> 		}
> 	}
>
> 	public class CurrentUserModel extends
> LoadableDetachableModel<Authentication> {
> 		protected Authentication load() {
> 			return SecurityContextHolder.getContext().getAuthentication();
> 		}
> 	}
>
> Note: If I update the code in comment marked as 'Line 1' with the following:
>
>      super(id, new
> Model(SecurityContextHolder.getContext().getAuthentication()));
>
> The error doesn't show up, that might be because its not a
> LoadableDetachableModel.
>
> Is it possible to pass an instance of LoadableDetachableModel to Component
> class constructor?
>
> I am getting the same error for the following code as well:
>
>      tree = new NestedTree<TreeItem>("tree", provider, state);
>
> Where state is an instance of the following class:
>
>      private class TreeItemExpansionModel extends
> LoadableDetachableModel<Set&lt;TreeItem>>
>      {
> 		private static final long serialVersionUID = 1L;
> 		private final String treePanelId;
> 		
> 		public TreeItemExpansionModel(String treePanelId) {
> 			this.treePanelId = treePanelId;
> 		}
>
> 		@Override
> 		protected Set<TreeItem> load() {
> 			return TreeItemExpansion.get(treePanelId);
> 		}
> 		
> 		@Override
> 		public boolean equals(Object obj) {
> 			if (obj instanceof TreeItemExpansionModel) {
> 				return ((TreeItemExpansionModel) obj).treePanelId.equals(treePanelId);
> 			}
> 			return false;
> 		}
>
> 		@Override
> 		public int hashCode() {
> 			return treePanelId.hashCode();
> 		}
>      }
>
> And the error is as follows:
>
> 	Caused by:
> org.apache.wicket.core.util.objects.checker.CheckingObjectOutputStream$ObjectCheckException:
> Not detached model found!
> 	A problem occurred while checking object with type:
> com.test.web.components.TreeItemProvider$TreeItemModel
> 	Field hierarchy is:
> 	   [class=com.test.web.admin.pages.HomePage, path=0]
> 		private java.lang.Object org.apache.wicket.MarkupContainer.children
> [class=[Ljava.lang.Object;]
> 		  java.util.List com.test.web.components.WhistlePanel.selectionList[2]
> [class=com.test.web.NavPanel, path=0:navPanel]
> 			private java.lang.Object org.apache.wicket.MarkupContainer.children
> [class=org.apache.wicket.extensions.markup.html.repeater.tree.NestedTree,
> path=0:navPanel:tree]
> 			  private java.lang.Object org.apache.wicket.MarkupContainer.children
> [class=org.apache.wicket.extensions.markup.html.repeater.tree.nested.Subtree,
> path=0:navPanel:tree:subtree]
> 				private java.lang.Object org.apache.wicket.MarkupContainer.children
> [class=org.apache.wicket.markup.repeater.RefreshingView,
> path=0:navPanel:tree:subtree:branches]
> 				  private java.lang.Object org.apache.wicket.MarkupContainer.children
> [class=[Ljava.lang.Object;]
> 					private java.lang.Object org.apache.wicket.MarkupContainer.children[0]
> [class=org.apache.wicket.extensions.markup.html.repeater.tree.nested.BranchItem,
> path=0:navPanel:tree:subtree:branches:1]
> 					  java.lang.Object org.apache.wicket.Component.data
> [class=com.test.web.components.TreeItemProvider$TreeItemModel] <----- field
> that is causing the problem
>
> Thanks in advance.
>
> --
> View this message in context: http://apache-wicket.1842946.n4.nabble.com/Error-Not-detached-model-found-tp4672624.html
> Sent from the Users forum mailing list archive at Nabble.com.
>
> ---------------------------------------------------------------------
> To unsubscribe, e-mail: users-unsubscribe@wicket.apache.org
> For additional commands, e-mail: users-help@wicket.apache.org
>

---------------------------------------------------------------------
To unsubscribe, e-mail: users-unsubscribe@wicket.apache.org
For additional commands, e-mail: users-help@wicket.apache.org