DATAREDIS-713 - Introduce constants for commonly used StringSerializers.

We now provide constant StringSerializers for US-ASCII, ISO 8859-1 and UTF-8 encoding.

Original Pull Request: #288
This commit is contained in:
Mark Paluch
2017-10-17 15:41:40 +02:00
committed by Christoph Strobl
parent 1e2a0f858f
commit 841d8ef447
32 changed files with 168 additions and 72 deletions

View File

@@ -100,7 +100,7 @@ public abstract class AbstractConnectionIntegrationTests {
protected StringRedisConnection connection;
protected RedisSerializer<Object> serializer = new JdkSerializationRedisSerializer();
protected RedisSerializer<String> stringSerializer = new StringRedisSerializer();
protected RedisSerializer<String> stringSerializer = StringRedisSerializer.UTF_8;
private static final byte[] EMPTY_ARRAY = new byte[0];

View File

@@ -58,7 +58,7 @@ public class DefaultStringRedisConnectionTests {
protected DefaultStringRedisConnection connection;
protected StringRedisSerializer serializer = new StringRedisSerializer();
protected StringRedisSerializer serializer = StringRedisSerializer.UTF_8;
protected String foo = "foo";

View File

@@ -73,13 +73,13 @@ abstract public class AbstractOperationsTestParams {
stringTemplate.afterPropertiesSet();
RedisTemplate<String, Long> longTemplate = new RedisTemplate<>();
longTemplate.setKeySerializer(new StringRedisSerializer());
longTemplate.setKeySerializer(StringRedisSerializer.UTF_8);
longTemplate.setValueSerializer(new GenericToStringSerializer<>(Long.class));
longTemplate.setConnectionFactory(jedisConnectionFactory);
longTemplate.afterPropertiesSet();
RedisTemplate<String, Double> doubleTemplate = new RedisTemplate<>();
doubleTemplate.setKeySerializer(new StringRedisSerializer());
doubleTemplate.setKeySerializer(StringRedisSerializer.UTF_8);
doubleTemplate.setValueSerializer(new GenericToStringSerializer<>(Double.class));
doubleTemplate.setConnectionFactory(jedisConnectionFactory);
doubleTemplate.afterPropertiesSet();

View File

@@ -43,6 +43,7 @@ import org.springframework.data.redis.serializer.StringRedisSerializer;
/**
* @author Christoph Strobl
* @author Mark Paluch
*/
@RunWith(MockitoJUnitRunner.Silent.class)
public class DefaultClusterOperationsUnitTests {
@@ -66,7 +67,7 @@ public class DefaultClusterOperationsUnitTests {
when(connectionFactory.getConnection()).thenReturn(connection);
when(connectionFactory.getClusterConnection()).thenReturn(connection);
serializer = new StringRedisSerializer();
serializer = StringRedisSerializer.UTF_8;
RedisTemplate<String, String> template = new RedisTemplate<>();
template.setConnectionFactory(connectionFactory);

View File

@@ -55,6 +55,7 @@ import org.springframework.test.annotation.IfProfileValue;
*
* @author Ninad Divadkar
* @author Christoph Strobl
* @author Mark Paluch
*/
@RunWith(Parameterized.class)
@IfProfileValue(name = "redisVersion", value = "3.2.0+")
@@ -203,8 +204,6 @@ public class DefaultGeoOperationsTests<K, M> {
List<String> result = geoOperations.hash(key, v1, v2);
assertThat(result, hasSize(2));
final RedisSerializer<String> serializer = new StringRedisSerializer();
assertThat(result.get(0), is(equalTo("sqc8b49rny0")));
assertThat(result.get(1), is(equalTo("sqdtr74hyu0")));
}

View File

@@ -75,7 +75,7 @@ public class DefaultReactiveHashOperationsIntegrationTests<K, HK, HV> {
lettuceConnectionFactory.afterPropertiesSet();
RedisSerializationContext<String, String> serializationContext = RedisSerializationContext
.fromSerializer(new StringRedisSerializer());
.fromSerializer(StringRedisSerializer.UTF_8);
ReactiveRedisTemplate<String, String> stringTemplate = new ReactiveRedisTemplate<>(lettuceConnectionFactory,
serializationContext);

View File

@@ -104,7 +104,7 @@ abstract public class ReactiveOperationsTestParams {
ReactiveRedisTemplate<Object, Object> pooledObjectTemplate = new ReactiveRedisTemplate<>(poolingConnectionFactory,
RedisSerializationContext.fromSerializer(jdkSerializationRedisSerializer));
StringRedisSerializer stringRedisSerializer = new StringRedisSerializer();
StringRedisSerializer stringRedisSerializer = StringRedisSerializer.UTF_8;
ReactiveRedisTemplate<String, String> stringTemplate = new ReactiveRedisTemplate<>(lettuceConnectionFactory,
RedisSerializationContext.fromSerializer(stringRedisSerializer));

View File

@@ -191,7 +191,7 @@ public class ReactiveRedisTemplateIntegrationTests<K, V> {
V value = valueFactory.instance();
SerializationPair json = SerializationPair.fromSerializer(new Jackson2JsonRedisSerializer<>(Person.class));
RedisElementReader<String> resultReader = RedisElementReader.from(new StringRedisSerializer());
RedisElementReader<String> resultReader = RedisElementReader.from(StringRedisSerializer.UTF_8);
assumeFalse(value instanceof Long);
@@ -346,7 +346,7 @@ public class ReactiveRedisTemplateIntegrationTests<K, V> {
RedisSerializationContext<K, V> objectSerializers = RedisSerializationContext.<K, V> newSerializationContext()
.key(serializationContext.getKeySerializationPair()) //
.value(serializationContext.getValueSerializationPair()) //
.hashKey(new StringRedisSerializer()) //
.hashKey(StringRedisSerializer.UTF_8) //
.hashValue(new JdkSerializationRedisSerializer()) //
.build();

View File

@@ -166,12 +166,12 @@ public class RedisClusterTemplateTests<K, V> extends RedisTemplateTests<K, V> {
jedisConnectionFactory.afterPropertiesSet();
RedisTemplate<String, String> jedisStringTemplate = new RedisTemplate<>();
jedisStringTemplate.setDefaultSerializer(new StringRedisSerializer());
jedisStringTemplate.setDefaultSerializer(StringRedisSerializer.UTF_8);
jedisStringTemplate.setConnectionFactory(jedisConnectionFactory);
jedisStringTemplate.afterPropertiesSet();
RedisTemplate<String, Long> jedisLongTemplate = new RedisTemplate<>();
jedisLongTemplate.setKeySerializer(new StringRedisSerializer());
jedisLongTemplate.setKeySerializer(StringRedisSerializer.UTF_8);
jedisLongTemplate.setValueSerializer(new GenericToStringSerializer<>(Long.class));
jedisLongTemplate.setConnectionFactory(jedisConnectionFactory);
jedisLongTemplate.afterPropertiesSet();
@@ -204,12 +204,12 @@ public class RedisClusterTemplateTests<K, V> extends RedisTemplateTests<K, V> {
lettuceConnectionFactory.afterPropertiesSet();
RedisTemplate<String, String> lettuceStringTemplate = new RedisTemplate<>();
lettuceStringTemplate.setDefaultSerializer(new StringRedisSerializer());
lettuceStringTemplate.setDefaultSerializer(StringRedisSerializer.UTF_8);
lettuceStringTemplate.setConnectionFactory(lettuceConnectionFactory);
lettuceStringTemplate.afterPropertiesSet();
RedisTemplate<String, Long> lettuceLongTemplate = new RedisTemplate<>();
lettuceLongTemplate.setKeySerializer(new StringRedisSerializer());
lettuceLongTemplate.setKeySerializer(StringRedisSerializer.UTF_8);
lettuceLongTemplate.setValueSerializer(new GenericToStringSerializer<>(Long.class));
lettuceLongTemplate.setConnectionFactory(lettuceConnectionFactory);
lettuceLongTemplate.afterPropertiesSet();

View File

@@ -309,7 +309,7 @@ public class RedisTemplateTests<K, V> {
assumeTrue(redisTemplate instanceof StringRedisTemplate);
redisTemplate.setKeySerializer(new StringRedisSerializer());
redisTemplate.setKeySerializer(StringRedisSerializer.UTF_8);
redisTemplate.setHashKeySerializer(new GenericToStringSerializer<>(Long.class));
redisTemplate.setHashValueSerializer(new Jackson2JsonRedisSerializer<>(Person.class));
@@ -800,7 +800,7 @@ public class RedisTemplateTests<K, V> {
final DefaultRedisScript<String> script = new DefaultRedisScript<>();
script.setScriptText("return 'Hey'");
script.setResultType(String.class);
assertEquals("Hey", redisTemplate.execute(script, redisTemplate.getValueSerializer(), new StringRedisSerializer(),
assertEquals("Hey", redisTemplate.execute(script, redisTemplate.getValueSerializer(), StringRedisSerializer.UTF_8,
Collections.singletonList(key1)));
}

View File

@@ -45,6 +45,7 @@ import org.springframework.test.annotation.IfProfileValue;
* @author Jennifer Hickey
* @author Thomas Darimont
* @author Christoph Strobl
* @author Mark Paluch
*/
@IfProfileValue(name = "redisVersion", value = "2.6+")
public abstract class AbstractDefaultScriptExecutorTests {
@@ -90,7 +91,7 @@ public abstract class AbstractDefaultScriptExecutorTests {
@Test
public void testExecuteBooleanResult() {
this.template = new RedisTemplate<String, Long>();
template.setKeySerializer(new StringRedisSerializer());
template.setKeySerializer(StringRedisSerializer.UTF_8);
template.setValueSerializer(new GenericToStringSerializer<>(Long.class));
template.setConnectionFactory(getConnectionFactory());
template.afterPropertiesSet();
@@ -155,7 +156,7 @@ public abstract class AbstractDefaultScriptExecutorTests {
@Test
public void testExecuteStatusResult() {
this.template = new RedisTemplate<String, Long>();
template.setKeySerializer(new StringRedisSerializer());
template.setKeySerializer(StringRedisSerializer.UTF_8);
template.setValueSerializer(new GenericToStringSerializer<>(Long.class));
template.setConnectionFactory(getConnectionFactory());
template.afterPropertiesSet();
@@ -171,7 +172,7 @@ public abstract class AbstractDefaultScriptExecutorTests {
public void testExecuteCustomResultSerializer() {
Jackson2JsonRedisSerializer<Person> personSerializer = new Jackson2JsonRedisSerializer<>(Person.class);
this.template = new RedisTemplate<String, Person>();
template.setKeySerializer(new StringRedisSerializer());
template.setKeySerializer(StringRedisSerializer.UTF_8);
template.setValueSerializer(personSerializer);
template.setConnectionFactory(getConnectionFactory());
template.afterPropertiesSet();
@@ -180,7 +181,7 @@ public abstract class AbstractDefaultScriptExecutorTests {
script.setResultType(String.class);
ScriptExecutor<String> scriptExecutor = new DefaultScriptExecutor<String>(template);
Person joe = new Person("Joe", "Schmoe", 23);
String result = scriptExecutor.execute(script, personSerializer, new StringRedisSerializer(),
String result = scriptExecutor.execute(script, personSerializer, StringRedisSerializer.UTF_8,
Collections.singletonList("bar"), joe);
assertEquals("FOO", result);
assertEquals(joe, template.boundValueOps("bar").get());

View File

@@ -111,7 +111,7 @@ public class DefaultReactiveScriptExecutorTests {
public void shouldReturnBoolean() {
RedisSerializationContextBuilder<String, Long> builder = RedisSerializationContext
.newSerializationContext(new StringRedisSerializer());
.newSerializationContext(StringRedisSerializer.UTF_8);
builder.value(new GenericToStringSerializer<>(Long.class));
DefaultRedisScript<Boolean> script = new DefaultRedisScript<>();
@@ -142,7 +142,7 @@ public class DefaultReactiveScriptExecutorTests {
Flux<List<String>> mylist = stringScriptExecutor.execute(script, Collections.singletonList("mylist"),
Collections.singletonList(1L), RedisElementWriter.from(new GenericToStringSerializer<>(Long.class)),
(RedisElementReader) RedisElementReader.from(new StringRedisSerializer()));
(RedisElementReader) RedisElementReader.from(StringRedisSerializer.UTF_8));
StepVerifier.create(mylist).expectNext(Collections.singletonList("a")).verifyComplete();
}
@@ -185,7 +185,7 @@ public class DefaultReactiveScriptExecutorTests {
script.setScriptText("return redis.call('SET',KEYS[1], ARGV[1])");
RedisSerializationContextBuilder<String, Long> builder = RedisSerializationContext
.newSerializationContext(new StringRedisSerializer());
.newSerializationContext(StringRedisSerializer.UTF_8);
builder.value(new GenericToStringSerializer<>(Long.class));
ReactiveScriptExecutor<String> scriptExecutor = new DefaultReactiveScriptExecutor<>(connectionFactory,
@@ -203,7 +203,7 @@ public class DefaultReactiveScriptExecutorTests {
Jackson2JsonRedisSerializer<Person> personSerializer = new Jackson2JsonRedisSerializer<>(Person.class);
RedisTemplate<String, Person> template = new RedisTemplate<>();
template.setKeySerializer(new StringRedisSerializer());
template.setKeySerializer(StringRedisSerializer.UTF_8);
template.setValueSerializer(personSerializer);
template.setConnectionFactory(getConnectionFactory());
template.afterPropertiesSet();
@@ -215,7 +215,7 @@ public class DefaultReactiveScriptExecutorTests {
Person joe = new Person("Joe", "Schmoe", 23);
Flux<String> result = stringScriptExecutor.execute(script, Collections.singletonList("bar"),
Collections.singletonList(joe), RedisElementWriter.from(personSerializer),
RedisElementReader.from(new StringRedisSerializer()));
RedisElementReader.from(StringRedisSerializer.UTF_8));
StepVerifier.create(result).expectNext("FOO").verifyComplete();

View File

@@ -36,10 +36,11 @@ import org.springframework.data.redis.serializer.StringRedisSerializer;
* @author Costin Leau
* @author Greg Turnquist
* @author Thomas Darimont
* @author Mark Paluch
*/
public class MessageListenerTest {
private static final StringRedisSerializer serializer = new StringRedisSerializer();
private static final StringRedisSerializer serializer = StringRedisSerializer.UTF_8;
private static final String CHANNEL = "some::test:";
private static final byte[] RAW_CHANNEL = serializer.serialize(CHANNEL);
private static final String PAYLOAD = "do re mi";

View File

@@ -33,9 +33,9 @@ public class RedisSerializationContextUnitTests {
public void shouldRejectBuildIfKeySerializerIsNotSet() {
RedisSerializationContext.<String, String> newSerializationContext() //
.value(new StringRedisSerializer()) //
.hashKey(new StringRedisSerializer()) //
.hashValue(new StringRedisSerializer()) //
.value(StringRedisSerializer.UTF_8) //
.hashKey(StringRedisSerializer.UTF_8) //
.hashValue(StringRedisSerializer.UTF_8) //
.build();
}
@@ -43,9 +43,9 @@ public class RedisSerializationContextUnitTests {
public void shouldRejectBuildIfValueSerializerIsNotSet() {
RedisSerializationContext.<String, String> newSerializationContext() //
.key(new StringRedisSerializer()) //
.hashKey(new StringRedisSerializer()) //
.hashValue(new StringRedisSerializer()) //
.key(StringRedisSerializer.UTF_8) //
.hashKey(StringRedisSerializer.UTF_8) //
.hashValue(StringRedisSerializer.UTF_8) //
.build();
}
@@ -53,9 +53,9 @@ public class RedisSerializationContextUnitTests {
public void shouldRejectBuildIfHashKeySerializerIsNotSet() {
RedisSerializationContext.<String, String> newSerializationContext() //
.key(new StringRedisSerializer()) //
.value(new StringRedisSerializer()) //
.hashValue(new StringRedisSerializer()) //
.key(StringRedisSerializer.UTF_8) //
.value(StringRedisSerializer.UTF_8) //
.hashValue(StringRedisSerializer.UTF_8) //
.build();
}
@@ -63,16 +63,16 @@ public class RedisSerializationContextUnitTests {
public void shouldRejectBuildIfHashValueSerializerIsNotSet() {
RedisSerializationContext.<String, String> newSerializationContext() //
.key(new StringRedisSerializer()) //
.value(new StringRedisSerializer()) //
.hashKey(new StringRedisSerializer()) //
.key(StringRedisSerializer.UTF_8) //
.value(StringRedisSerializer.UTF_8) //
.hashKey(StringRedisSerializer.UTF_8) //
.build();
}
@Test // DATAREDIS-602
public void shouldUseDefaultIfSet() {
RedisSerializationContext.<String, String> newSerializationContext(new StringRedisSerializer())
RedisSerializationContext.<String, String> newSerializationContext(StringRedisSerializer.UTF_8)
.key(new GenericToStringSerializer(Long.class))//
.build();
}
@@ -114,10 +114,10 @@ public class RedisSerializationContextUnitTests {
private RedisSerializationContext<String, Long> createSerializationContext() {
return RedisSerializationContext.<String, Long> newSerializationContext() //
.key(new StringRedisSerializer()) //
.key(StringRedisSerializer.UTF_8) //
.value(ByteBuffer::getLong, value -> (ByteBuffer) ByteBuffer.allocate(8).putLong(value).flip()) //
.hashKey(new StringRedisSerializer()) //
.hashValue(new StringRedisSerializer()) //
.hashKey(StringRedisSerializer.UTF_8) //
.hashValue(StringRedisSerializer.UTF_8) //
.build();
}
}

View File

@@ -0,0 +1,70 @@
/*
* Copyright 2017 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.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.springframework.data.redis.serializer;
import static org.hamcrest.Matchers.*;
import static org.junit.Assert.*;
import java.nio.charset.StandardCharsets;
import org.junit.Test;
/**
* Unit tests for {@link StringRedisSerializer}.
*
* @author Mark Paluch
*/
public class StringRedisSerializerUnitTests {
@Test
public void shouldSerializeToAscii() {
assertThat(StringRedisSerializer.US_ASCII.serialize("foo-bar"), is(equalTo("foo-bar".getBytes())));
assertThat(StringRedisSerializer.US_ASCII.serialize("üߨ"), is(equalTo("???".getBytes())));
}
@Test
public void shouldDeserializeFromAscii() {
assertThat(StringRedisSerializer.US_ASCII.deserialize("foo-bar".getBytes()), is(equalTo("foo-bar")));
}
@Test
public void shouldSerializeToIso88591() {
assertThat(StringRedisSerializer.ISO_8859_1.serialize("üߨ"),
is(equalTo("üߨ".getBytes(StandardCharsets.ISO_8859_1))));
}
@Test
public void shouldDeserializeFromIso88591() {
assertThat(StringRedisSerializer.ISO_8859_1.deserialize("üߨ".getBytes(StandardCharsets.ISO_8859_1)),
is(equalTo("üߨ")));
}
@Test
public void shouldSerializeToUtf8() {
assertThat(StringRedisSerializer.UTF_8.serialize("foo-bar"), is(equalTo("foo-bar".getBytes())));
assertThat(StringRedisSerializer.UTF_8.serialize("üߨ"), is(equalTo("üߨ".getBytes(StandardCharsets.UTF_8))));
}
@Test
public void shouldDeserializeFromUtf8() {
assertThat(StringRedisSerializer.UTF_8.deserialize("üߨ".getBytes(StandardCharsets.UTF_8)), is(equalTo("üߨ")));
}
}

View File

@@ -62,7 +62,7 @@ public class RedisAtomicDoubleTests extends AbstractRedisAtomicsTests {
this.template = new RedisTemplate<>();
this.template.setConnectionFactory(factory);
this.template.setKeySerializer(new StringRedisSerializer());
this.template.setKeySerializer(StringRedisSerializer.UTF_8);
this.template.setValueSerializer(new GenericToStringSerializer<>(Double.class));
this.template.afterPropertiesSet();
@@ -192,7 +192,7 @@ public class RedisAtomicDoubleTests extends AbstractRedisAtomicsTests {
expectedException.expectMessage("a valid value serializer in template is required");
RedisTemplate<String, Double> template = new RedisTemplate<>();
template.setKeySerializer(new StringRedisSerializer());
template.setKeySerializer(StringRedisSerializer.UTF_8);
new RedisAtomicDouble("foo", template);
}

View File

@@ -60,7 +60,7 @@ public class RedisAtomicIntegerTests extends AbstractRedisAtomicsTests {
this.template = new RedisTemplate<>();
this.template.setConnectionFactory(factory);
this.template.setKeySerializer(new StringRedisSerializer());
this.template.setKeySerializer(StringRedisSerializer.UTF_8);
this.template.setValueSerializer(new GenericToStringSerializer<>(Integer.class));
this.template.afterPropertiesSet();
@@ -191,7 +191,7 @@ public class RedisAtomicIntegerTests extends AbstractRedisAtomicsTests {
expectedException.expectMessage("a valid value serializer in template is required");
RedisTemplate<String, Integer> template = new RedisTemplate<>();
template.setKeySerializer(new StringRedisSerializer());
template.setKeySerializer(StringRedisSerializer.UTF_8);
new RedisAtomicInteger("foo", template);
}

View File

@@ -41,6 +41,7 @@ import org.springframework.data.redis.serializer.StringRedisSerializer;
* @author Jennifer Hickey
* @author Thomas Darimont
* @author Christoph Strobl
* @author Mark Paluch
*/
@RunWith(Parameterized.class)
public class RedisAtomicLongTests extends AbstractRedisAtomicsTests {
@@ -56,7 +57,7 @@ public class RedisAtomicLongTests extends AbstractRedisAtomicsTests {
this.template = new RedisTemplate<>();
this.template.setConnectionFactory(factory);
this.template.setKeySerializer(new StringRedisSerializer());
this.template.setKeySerializer(StringRedisSerializer.UTF_8);
this.template.setValueSerializer(new GenericToStringSerializer<>(Long.class));
this.template.afterPropertiesSet();
@@ -165,7 +166,7 @@ public class RedisAtomicLongTests extends AbstractRedisAtomicsTests {
expectedException.expectMessage("a valid value serializer in template is required");
RedisTemplate<String, Long> template = new RedisTemplate<>();
template.setKeySerializer(new StringRedisSerializer());
template.setKeySerializer(StringRedisSerializer.UTF_8);
new RedisAtomicLong("foo", template);
}
@@ -174,7 +175,7 @@ public class RedisAtomicLongTests extends AbstractRedisAtomicsTests {
RedisTemplate<String, Long> template = new RedisTemplate<>();
template.setConnectionFactory(factory);
template.setKeySerializer(new StringRedisSerializer());
template.setKeySerializer(StringRedisSerializer.UTF_8);
template.setValueSerializer(new GenericToStringSerializer<>(Long.class));
template.afterPropertiesSet();

View File

@@ -54,7 +54,7 @@ public abstract class CollectionTestParams {
}
OxmSerializer serializer = new OxmSerializer(xstream, xstream);
Jackson2JsonRedisSerializer<Person> jackson2JsonSerializer = new Jackson2JsonRedisSerializer<>(Person.class);
StringRedisSerializer stringSerializer = new StringRedisSerializer();
StringRedisSerializer stringSerializer = StringRedisSerializer.UTF_8;
// create Jedis Factory
ObjectFactory<String> stringFactory = new StringObjectFactory();

View File

@@ -45,6 +45,7 @@ import org.springframework.oxm.xstream.XStreamMarshaller;
* @author Jennifer Hickey
* @author Thomas Darimont
* @author Christoph Strobl
* @author Mark Paluch
*/
public class RedisMapTests extends AbstractRedisMapTests<Object, Object> {
@@ -75,7 +76,7 @@ public class RedisMapTests extends AbstractRedisMapTests<Object, Object> {
Jackson2JsonRedisSerializer<Person> jackson2JsonSerializer = new Jackson2JsonRedisSerializer<>(Person.class);
Jackson2JsonRedisSerializer<String> jackson2JsonStringSerializer = new Jackson2JsonRedisSerializer<>(
String.class);
StringRedisSerializer stringSerializer = new StringRedisSerializer();
StringRedisSerializer stringSerializer = StringRedisSerializer.UTF_8;
PoolConfig defaultPoolConfig = new PoolConfig();
defaultPoolConfig.setMaxActive(1000);