460297 Use webapp classloader for infinispan deserialization
This commit is contained in:
parent
23216076a9
commit
6c97a0dad0
|
@ -0,0 +1,84 @@
|
|||
//
|
||||
// ========================================================================
|
||||
// Copyright (c) 1995-2015 Mort Bay Consulting Pty. Ltd.
|
||||
// ------------------------------------------------------------------------
|
||||
// All rights reserved. This program and the accompanying materials
|
||||
// are made available under the terms of the Eclipse Public License v1.0
|
||||
// and Apache License v2.0 which accompanies this distribution.
|
||||
//
|
||||
// The Eclipse Public License is available at
|
||||
// http://www.eclipse.org/legal/epl-v10.html
|
||||
//
|
||||
// The Apache License v2.0 is available at
|
||||
// http://www.opensource.org/licenses/apache2.0.php
|
||||
//
|
||||
// You may elect to redistribute this code under either of these licenses.
|
||||
// ========================================================================
|
||||
//
|
||||
|
||||
package org.eclipse.jetty.session.infinispan;
|
||||
|
||||
import org.infinispan.commons.marshall.jboss.AbstractJBossMarshaller;
|
||||
import org.jboss.marshalling.ContextClassResolver;
|
||||
|
||||
|
||||
/**
|
||||
* WebAppMarshaller
|
||||
*
|
||||
* An implementation of the AbstractJBossMarshaller code that is just
|
||||
* enough to provide a ContextClassResolver that will use the Thread Context Classloader
|
||||
* in order to deserialize session attribute classes.
|
||||
*
|
||||
* This is necessary because the standard infinispan marshaller (GenericJBossMarshaller) uses the
|
||||
* classloader of the loader that loaded itself. When using the infinispan module in Jetty, all of
|
||||
* the infinispan classes will be on the container classpath. That means that the GenericJBossMarshaller
|
||||
* returns the container classloader which is unable to load any webapp classes. This class ensures
|
||||
* that it is always the webapp's classloader that will be used.
|
||||
*
|
||||
* In order to use this class, you should put a hotrod-client.properties file into the
|
||||
* ${jetty.base}/resources directory that contains this line:
|
||||
*
|
||||
* infinispan.client.hotrod.marshaller=org.eclipse.jetty.session.infinispan.WebAppMarshaller
|
||||
*
|
||||
* You will also need to add the following lines to a context xml file for your webapp to
|
||||
* permit the webapp's classloader to see the org.eclipse.jetty.session.infinispan classes for
|
||||
* the deserialization to work correctly:
|
||||
*
|
||||
* <Call name="prependServerClass">
|
||||
* <Arg>-org.eclipse.jetty.session.infinispan.</Arg>
|
||||
* </Call>
|
||||
*
|
||||
*/
|
||||
public class WebAppMarshaller extends AbstractJBossMarshaller
|
||||
{
|
||||
|
||||
/**
|
||||
* WebAppContextClassResolver
|
||||
*
|
||||
* Provides the Thread Context Classloader to use for deserializing.
|
||||
*
|
||||
*/
|
||||
public static class WebAppContextClassResolver extends ContextClassResolver
|
||||
{
|
||||
public WebAppContextClassResolver ()
|
||||
{
|
||||
super();
|
||||
}
|
||||
|
||||
@Override
|
||||
protected ClassLoader getClassLoader()
|
||||
{
|
||||
return Thread.currentThread().getContextClassLoader();
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
public WebAppMarshaller ()
|
||||
{
|
||||
super();
|
||||
baseCfg.setClassResolver(new WebAppContextClassResolver());
|
||||
}
|
||||
|
||||
|
||||
}
|
Loading…
Reference in New Issue