Caused by: org.springframework.data.redis.RedisSystemException: Unknown redis exception; nested exception is java.lang.NullPointerException
at org.springframework.data.redis.FallbackExceptionTranslationStrategy.getFallback(FallbackExceptionTranslationStrategy.java:48)
at org.springframework.data.redis.FallbackExceptionTranslationStrategy.translate(FallbackExceptionTranslationStrategy.java:38)
at org.springframework.data.redis.connection.jedis.JedisConnection.convertJedisAccessException(JedisConnection.java:195)
at org.springframework.data.redis.connection.jedis.JedisConnection.hMSet(JedisConnection.java:2631)
at org.springframework.data.redis.core.DefaultHashOperations$7.doInRedis(DefaultHashOperations.java:134)
at org.springframework.data.redis.core.RedisTemplate.execute(RedisTemplate.java:190)
at org.springframework.data.redis.core.RedisTemplate.execute(RedisTemplate.java:152)
at org.springframework.data.redis.core.AbstractOperations.execute(AbstractOperations.java:85)
at org.springframework.data.redis.core.DefaultHashOperations.putAll(DefaultHashOperations.java:131)
at org.springframework.data.redis.core.DefaultBoundHashOperations.putAll(DefaultBoundHashOperations.java:85)
at org.springframework.session.data.redis.RedisOperationsSessionRepository$RedisSession.saveDelta(RedisOperationsSessionRepository.java:778)
at org.springframework.session.data.redis.RedisOperationsSessionRepository$RedisSession.access$000(RedisOperationsSessionRepository.java:670)
at org.springframework.session.data.redis.RedisOperationsSessionRepository.save(RedisOperationsSessionRepository.java:388)
at org.springframework.session.data.redis.RedisOperationsSessionRepository.save(RedisOperationsSessionRepository.java:245)
at org.springframework.session.web.http.SessionRepositoryFilter$SessionRepositoryRequestWrapper.commitSession(SessionRepositoryFilter.java:245)
at org.springframework.session.web.http.SessionRepositoryFilter$SessionRepositoryRequestWrapper.access$100(SessionRepositoryFilter.java:217)
at org.springframework.session.web.http.SessionRepositoryFilter$SessionRepositoryResponseWrapper.onResponseCommitted(SessionRepositoryFilter.java:205)
at org.springframework.session.web.http.OnCommittedResponseWrapper.doOnResponseCommitted(OnCommittedResponseWrapper.java:226)
at org.springframework.session.web.http.OnCommittedResponseWrapper.checkContentLength(OnCommittedResponseWrapper.java:216)
at org.springframework.session.web.http.OnCommittedResponseWrapper.access$200(OnCommittedResponseWrapper.java:37)
at org.springframework.session.web.http.OnCommittedResponseWrapper$SaveContextPrintWriter.write(OnCommittedResponseWrapper.java:278)
at org.apache.jasper.runtime.JspWriterImpl.write(JspWriterImpl.java:285)
at java.io.PrintWriter.write(PrintWriter.java:426)
at org.apache.jasper.runtime.JspWriterImpl.flushBuffer(JspWriterImpl.java:119)
at org.apache.jasper.runtime.JspWriterImpl.write(JspWriterImpl.java:336)
at java.io.Writer.write(Writer.java:157)
at org.apache.jsp.pages.include.include_jsp._jspService(include_jsp.java:293)
at org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:70)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:731)
at org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:439)
... 69 more
Caused by: java.lang.NullPointerException
at redis.clients.jedis.Protocol.sendCommand(Protocol.java:89)
at redis.clients.jedis.Protocol.sendCommand(Protocol.java:74)
at redis.clients.jedis.Connection.sendCommand(Connection.java:78)
at redis.clients.jedis.BinaryClient.hmset(BinaryClient.java:242)
at redis.clients.jedis.BinaryJedis.hmset(BinaryJedis.java:825)
at org.springframework.data.redis.connection.jedis.JedisConnection.hMSet(JedisConnection.java:2629)
hMSet 的 value不能为null.
Session().removeAttribute 将对应的value设置为了null,所以报异常了
解决方案
public class KryoRedisSerializer<T> implements RedisSerializer<T> {
@Override
public byte[] serialize(Object obj) throws SerializationException {
if (null == obj) {
return EMPTY_ARRAY;
}
return KryoUtil.writeToByteArray(obj);
}
static final byte[] EMPTY_ARRAY = new byte[0];
static boolean isEmpty(byte[] data) {
return (data == null || data.length == 0);
}
@Override
public T deserialize(byte[] bytes) throws SerializationException {
if (isEmpty(bytes)) {
return null;
}
return KryoUtil.readFromByteArray(bytes);
}
public static void main(String[] args) {
byte[] bytes = KryoUtil.writeToByteArray("");
Object o = KryoUtil.readFromByteArray(bytes);
System.out.println("============="+o);
}