resolves issue: ClassNotFoundException thrown during SeriazliationCodec.decode #2136

pull/2138/head
Zhelyazko Chobantonov 6 years ago
parent 72ba19756d
commit f62f028e08

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

@ -275,9 +275,18 @@ public class TasksRunnerService implements RemoteExecutorService {
T task; T task;
if (params.getLambdaBody() != null) { if (params.getLambdaBody() != null) {
ByteArrayInputStream is = new ByteArrayInputStream(params.getLambdaBody()); ByteArrayInputStream is = new ByteArrayInputStream(params.getLambdaBody());
ObjectInput oo = new CustomObjectInputStream(classLoaderCodec.getClassLoader(), is);
task = (T) oo.readObject(); //set thread context class loader to be the classLoaderCodec.getClassLoader() variable as there could be reflection
oo.close(); //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 { } else {
task = (T) classLoaderCodec.getValueDecoder().decode(stateBuf, null); task = (T) classLoaderCodec.getValueDecoder().decode(stateBuf, null);
} }

Loading…
Cancel
Save