diff --git a/src/org/redkale/boot/NodeServer.java b/src/org/redkale/boot/NodeServer.java index a856db5ef..93bff70f7 100644 --- a/src/org/redkale/boot/NodeServer.java +++ b/src/org/redkale/boot/NodeServer.java @@ -274,10 +274,10 @@ public abstract class NodeServer { Type genericType = field.getGenericType(); ParameterizedType pt = (genericType instanceof ParameterizedType) ? (ParameterizedType) genericType : null; Type valType = pt == null ? null : pt.getActualTypeArguments()[0]; - if (sourceType == CacheMemorySource.class) { - CacheMemorySource memorySource = (CacheMemorySource) source; - memorySource.setStoreType(valType instanceof Class ? (Class) valType : Object.class); - if (field.getAnnotation(Transient.class) != null) memorySource.setNeedStore(false); //必须在setStoreType之后 + if (CacheSource.class.isAssignableFrom(sourceType)) { + CacheSource cacheSource = (CacheSource) source; + cacheSource.initValueType(valType instanceof Class ? (Class) valType : Object.class); + cacheSource.initTransient(field.getAnnotation(Transient.class) != null); //必须在initValueType之后 } application.cacheSources.add((CacheSource) source); appResFactory.register(resourceName, genericType, source); diff --git a/src/org/redkale/convert/json/JsonReader.java b/src/org/redkale/convert/json/JsonReader.java index f0d5ffb52..aad1b4b88 100644 --- a/src/org/redkale/convert/json/JsonReader.java +++ b/src/org/redkale/convert/json/JsonReader.java @@ -488,6 +488,7 @@ public class JsonReader extends Reader { } else { final int start = currpos; for (;;) { + if(currpos >= text0.length) break; char ch = text0[currpos]; if (ch == ',' || ch <= ' ' || ch == '}' || ch == ']' || ch == ':') break; currpos++; diff --git a/src/org/redkale/source/CacheMemorySource.java b/src/org/redkale/source/CacheMemorySource.java index ba8f1dd33..832554737 100644 --- a/src/org/redkale/source/CacheMemorySource.java +++ b/src/org/redkale/source/CacheMemorySource.java @@ -62,16 +62,17 @@ public class CacheMemorySource extends AbstractService impleme public CacheMemorySource() { } - public final CacheMemorySource setStoreType(Class valueType) { + @Override + public final void initValueType(Type valueType) { this.objValueType = valueType; this.setValueType = TypeToken.createParameterizedType(null, CopyOnWriteArraySet.class, valueType); this.listValueType = TypeToken.createParameterizedType(null, ConcurrentLinkedQueue.class, valueType); - this.setNeedStore(this.objValueType != null); - return this; + this.initTransient(this.objValueType == null); } - public final void setNeedStore(boolean needStore) { - this.needStore = needStore; + @Override + public final void initTransient(boolean flag) { + this.needStore = !flag; } @Override @@ -83,12 +84,12 @@ public class CacheMemorySource extends AbstractService impleme String storeValueStr = prop.getValue("value-type"); if (storeValueStr != null) { try { - this.setStoreType(Thread.currentThread().getContextClassLoader().loadClass(storeValueStr)); + this.initValueType(Thread.currentThread().getContextClassLoader().loadClass(storeValueStr)); } catch (Throwable e) { logger.log(Level.SEVERE, self.getClass().getSimpleName() + " load key & value store class (" + storeValueStr + ") error", e); } } - if (prop.getBoolValue("store-ignore", false)) setNeedStore(false); + this.initTransient(prop.getBoolValue("store-ignore", false)); } String expireHandlerClass = prop == null ? null : prop.getValue("expirehandler"); if (expireHandlerClass != null) { diff --git a/src/org/redkale/source/CacheSource.java b/src/org/redkale/source/CacheSource.java index c103f04bc..93a9c06b9 100644 --- a/src/org/redkale/source/CacheSource.java +++ b/src/org/redkale/source/CacheSource.java @@ -6,6 +6,7 @@ package org.redkale.source; import java.beans.ConstructorProperties; +import java.lang.reflect.Type; import java.util.*; import java.util.concurrent.*; import org.redkale.convert.ConvertColumn; @@ -21,6 +22,10 @@ import org.redkale.convert.json.JsonFactory; */ public interface CacheSource { + public void initValueType(Type valueType); + + public void initTransient(boolean flag); + default boolean isOpen() { return true; }