Merge pull request #2138 from jchobantonov/master

resolves issue: ClassNotFoundException thrown during SeriazliationCodec.decode #2136
pull/2160/head^2
Nikita Koksharov 6 years ago committed by GitHub
commit 9e5087cf5e
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23

@ -40,14 +40,22 @@ public class SerializationCodec extends BaseCodec {
@Override
public Object decode(ByteBuf buf, State state) throws IOException {
try {
ByteBufInputStream in = new ByteBufInputStream(buf);
ObjectInputStream inputStream;
if (classLoader != null) {
inputStream = new CustomObjectInputStream(classLoader, in);
} else {
inputStream = new ObjectInputStream(in);
//set thread context class loader to be the classLoader variable as there could be reflection
//done while reading from input stream which reflection will use thread class loader to load classes on demand
ClassLoader currentThreadClassLoader = Thread.currentThread().getContextClassLoader();
try {
ByteBufInputStream in = new ByteBufInputStream(buf);
ObjectInputStream inputStream;
if (classLoader != null) {
Thread.currentThread().setContextClassLoader(classLoader);
inputStream = new CustomObjectInputStream(classLoader, in);
} else {
inputStream = new ObjectInputStream(in);
}
return inputStream.readObject();
} finally {
Thread.currentThread().setContextClassLoader(currentThreadClassLoader);
}
return inputStream.readObject();
} catch (IOException e) {
throw e;
} catch (Exception e) {

@ -275,9 +275,18 @@ public class TasksRunnerService implements RemoteExecutorService {
T task;
if (params.getLambdaBody() != null) {
ByteArrayInputStream is = new ByteArrayInputStream(params.getLambdaBody());
ObjectInput oo = new CustomObjectInputStream(classLoaderCodec.getClassLoader(), is);
task = (T) oo.readObject();
oo.close();
//set thread context class loader to be the classLoaderCodec.getClassLoader() variable as there could be reflection
//done while reading from input stream which reflection will use thread class loader to load classes on demand
ClassLoader currentThreadClassLoader = Thread.currentThread().getContextClassLoader();
try {
Thread.currentThread().setContextClassLoader(classLoaderCodec.getClassLoader());
ObjectInput oo = new CustomObjectInputStream(classLoaderCodec.getClassLoader(), is);
task = (T) oo.readObject();
oo.close();
} finally {
Thread.currentThread().setContextClassLoader(currentThreadClassLoader);
}
} else {
task = (T) classLoaderCodec.getValueDecoder().decode(stateBuf, null);
}

Loading…
Cancel
Save