@SuppressWarnings("unchecked")
    @Override
    public <T> void getProperty(String namespace, String propertyName, T defaultValue, IAsyncResultHandler<T> handler) {
        if (isNull(defaultValue)) {
            handler.handle(AsyncResultImpl.create(new Exception("Null defaultValue is not allowed.")));
            return;
        }
        final String namespacedKey = buildNamespacedKey(namespace, propertyName);
        if (getStore().containsKey(namespacedKey)) {
            try {
                final Class<T> valueClass = (Class<T>) defaultValue.getClass();
                final T rval = getStore().get(namespacedKey, valueClass);
                handler.handle(AsyncResultImpl.create(rval));

            } catch (Exception e) {
                LOGGER.error(e, "Error reading from shared state with namespace: {} and key: {}",
                        namespace, propertyName);

                handler.handle(AsyncResultImpl.create(e));
            }

        } else {
            handler.handle(AsyncResultImpl.create(defaultValue));
        }
    }
@see ISharedStateComponent#getProperty(String, String, Object, IAsyncResultHandler)
gateway/engine/storage-common/src/main/java/io/apiman/gateway/engine/storage/component/AbstractSharedStateComponent.java