Improve update handling in HazelcastSessionRepository

This commit improves HazelcastSessionRepository.SessionUpdateEntryProcessor to avoid NPE in scenario where save operation was invoked for session that was already deleted.

See gh-1076
This commit is contained in:
Vedran Pavic
2018-05-15 08:16:20 +02:00
parent b6348736ac
commit 42818a1b90
2 changed files with 20 additions and 3 deletions

View File

@@ -1,5 +1,5 @@
/*
* Copyright 2014-2017 the original author or authors.
* Copyright 2014-2018 the original author or authors.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@@ -153,4 +153,18 @@ public abstract class AbstractHazelcastRepositoryITests {
this.repository.deleteById(toSave.getId());
}
@Test // gh-1076
public void attemptToUpdateSessionAfterDelete() {
HazelcastSession session = this.repository.createSession();
String sessionId = session.getId();
this.repository.save(session);
session = this.repository.findById(sessionId);
session.setAttribute("attributeName", "attributeValue");
this.repository.deleteById(sessionId);
this.repository.save(session);
assertThat(this.repository.findById(sessionId)).isNull();
}
}

View File

@@ -1,5 +1,5 @@
/*
* Copyright 2014-2017 the original author or authors.
* Copyright 2014-2018 the original author or authors.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@@ -452,6 +452,9 @@ public class HazelcastSessionRepository implements
@Override
public Object process(Map.Entry<String, MapSession> entry) {
MapSession value = entry.getValue();
if (value == null) {
return Boolean.FALSE;
}
value.setLastAccessedTime(this.lastAccessedTime);
value.setMaxInactiveInterval(this.maxInactiveInterval);
for (final Map.Entry<String, Object> attribute : this.delta.entrySet()) {
@@ -463,7 +466,7 @@ public class HazelcastSessionRepository implements
}
}
entry.setValue(value);
return value;
return Boolean.TRUE;
}
}