diff --git a/src/main/java/org/springframework/data/redis/core/script/DefaultRedisScript.java b/src/main/java/org/springframework/data/redis/core/script/DefaultRedisScript.java index 43374983f..c78a26a29 100644 --- a/src/main/java/org/springframework/data/redis/core/script/DefaultRedisScript.java +++ b/src/main/java/org/springframework/data/redis/core/script/DefaultRedisScript.java @@ -75,7 +75,7 @@ public class DefaultRedisScript implements RedisScript, InitializingBean { * (non-Javadoc) * @see org.springframework.beans.factory.InitializingBean#afterPropertiesSet() */ - public void afterPropertiesSet() throws Exception { + public void afterPropertiesSet() { Assert.state(this.scriptSource != null, "Either script, script location," + " or script source is required"); } diff --git a/src/main/java/org/springframework/data/redis/core/script/RedisScript.java b/src/main/java/org/springframework/data/redis/core/script/RedisScript.java index 0716fc100..67c16e204 100644 --- a/src/main/java/org/springframework/data/redis/core/script/RedisScript.java +++ b/src/main/java/org/springframework/data/redis/core/script/RedisScript.java @@ -15,15 +15,17 @@ */ package org.springframework.data.redis.core.script; +import org.springframework.core.io.Resource; import org.springframework.lang.Nullable; import org.springframework.util.Assert; /** - * A script to be executed using the Redis scripting support available as of - * version 2.6 + * A script to be executed using the Redis scripting support available as + * of version 2.6 * * @author Jennifer Hickey * @author Christoph Strobl + * @author Mark Paluch * @param The script result type. Should be one of Long, Boolean, List, or deserialized value type. Can be * {@litearl null} if the script returns a throw-away status (i.e "OK") */ @@ -80,4 +82,43 @@ public interface RedisScript { return new DefaultRedisScript(script, resultType); } + + /** + * Creates new {@link RedisScript} from {@link Resource}. + * + * @param resource must not be {@literal null}. + * @return new instance of {@link RedisScript}. + * @since 2.2 + */ + static RedisScript of(Resource resource) { + + Assert.notNull(resource, "Resource must not be null!"); + + DefaultRedisScript script = new DefaultRedisScript<>(); + script.setLocation(resource); + script.afterPropertiesSet(); + + return script; + } + + /** + * Creates new {@link RedisScript} from {@link Resource}. + * + * @param resource must not be {@literal null}. + * @param resultType must not be {@literal null}. + * @return new instance of {@link RedisScript}. + * @since 2.2 + */ + static RedisScript of(Resource resource, Class resultType) { + + Assert.notNull(resource, "Resource must not be null!"); + Assert.notNull(resultType, "ResultType must not be null!"); + + DefaultRedisScript script = new DefaultRedisScript<>(); + script.setResultType(resultType); + script.setLocation(resource); + script.afterPropertiesSet(); + + return script; + } } diff --git a/src/test/java/org/springframework/data/redis/core/script/DefaultRedisScriptTests.java b/src/test/java/org/springframework/data/redis/core/script/DefaultRedisScriptTests.java index 6db812600..72730c267 100644 --- a/src/test/java/org/springframework/data/redis/core/script/DefaultRedisScriptTests.java +++ b/src/test/java/org/springframework/data/redis/core/script/DefaultRedisScriptTests.java @@ -28,6 +28,7 @@ import org.springframework.scripting.support.StaticScriptSource; * * @author Jennifer Hickey * @author Christoph Strobl + * @author Mark Paluch */ public class DefaultRedisScriptTests { @@ -55,6 +56,14 @@ public class DefaultRedisScriptTests { assertThat(redisScript.getScriptAsString()).isEqualTo("return ARGS[1]"); } + @Test // DATAREDIS-1030 + public void testGetScriptAsStringFromResource() { + + RedisScript redisScript = RedisScript + .of(new ClassPathResource("org/springframework/data/redis/core/script/cas.lua")); + assertThat(redisScript.getScriptAsString()).startsWith("local current = redis.call('GET', KEYS[1])"); + } + @Test(expected = ScriptingException.class) public void testGetScriptAsStringError() {