public class

CodebaseAwareObjectInputStream

extends ConfigurableObjectInputStream
java.lang.Object
   ↳ java.io.InputStream
     ↳ java.io.ObjectInputStream
       ↳ org.springframework.core.ConfigurableObjectInputStream
         ↳ org.springframework.remoting.rmi.CodebaseAwareObjectInputStream

Class Overview

Special ObjectInputStream subclass that falls back to a specified codebase to load classes from if not found locally. In contrast to standard RMI conventions for dynamic class download, it is the client that determines the codebase URL here, rather than the "java.rmi.server.codebase" system property on the server.

Uses the JDK's RMIClassLoader to load classes from the specified codebase. The codebase can consist of multiple URLs, separated by spaces. Note that RMIClassLoader requires a SecurityManager to be set, like when using dynamic class download with standard RMI! (See the RMI documentation for details.)

Despite residing in the RMI package, this class is not used for RmiClientInterceptor, which uses the standard RMI infrastructure instead and thus is only able to rely on RMI's standard dynamic class download via "java.rmi.server.codebase". CodebaseAwareObjectInputStream is used by HttpInvokerClientInterceptor (see the "codebaseUrl" property there).

Thanks to Lionel Mestre for suggesting the option and providing a prototype!

See Also

Summary

[Expand]
Inherited Constants
From interface java.io.ObjectStreamConstants
[Expand]
Inherited Fields
From interface java.io.ObjectStreamConstants
Public Constructors
CodebaseAwareObjectInputStream(InputStream in, String codebaseUrl)
Create a new CodebaseAwareObjectInputStream for the given InputStream and codebase.
CodebaseAwareObjectInputStream(InputStream in, ClassLoader classLoader, String codebaseUrl)
Create a new CodebaseAwareObjectInputStream for the given InputStream and codebase.
Protected Methods
ClassLoader getFallbackClassLoader()
Return the fallback ClassLoader to use when no ClassLoader was specified and ObjectInputStream's own default ClassLoader failed.
Class resolveFallbackIfPossible(String className, ClassNotFoundException ex)
Resolve the given class name against a fallback class loader.
[Expand]
Inherited Methods
From class org.springframework.core.ConfigurableObjectInputStream
From class java.io.ObjectInputStream
From class java.io.InputStream
From class java.lang.Object
From interface java.io.Closeable
From interface java.io.DataInput
From interface java.io.ObjectInput

Public Constructors

public CodebaseAwareObjectInputStream (InputStream in, String codebaseUrl)

Create a new CodebaseAwareObjectInputStream for the given InputStream and codebase.

Parameters
in the InputStream to read from
codebaseUrl the codebase URL to load classes from if not found locally (can consist of multiple URLs, separated by spaces)
Throws
IOException

public CodebaseAwareObjectInputStream (InputStream in, ClassLoader classLoader, String codebaseUrl)

Create a new CodebaseAwareObjectInputStream for the given InputStream and codebase.

Parameters
in the InputStream to read from
classLoader the ClassLoader to use for loading local classes (may be null to indicate RMI's default ClassLoader)
codebaseUrl the codebase URL to load classes from if not found locally (can consist of multiple URLs, separated by spaces)
Throws
IOException

Protected Methods

protected ClassLoader getFallbackClassLoader ()

Return the fallback ClassLoader to use when no ClassLoader was specified and ObjectInputStream's own default ClassLoader failed.

The default implementation simply returns null.

Throws
IOException

protected Class resolveFallbackIfPossible (String className, ClassNotFoundException ex)

Resolve the given class name against a fallback class loader.

The default implementation simply rethrows the original exception, since there is no fallback available.

Parameters
className the class name to resolve
ex the original exception thrown when attempting to load the class
Returns
  • the newly resolved class (never null)