Skip to content

Commit daa4d3c

Browse files
committed
Provide workaround in Spring Data Redis RedisCustomConversions for java.time.OffsetDateTime and java.time.OffsetTime types.
See spring-projects/spring-data-redis#2677.
1 parent bc472f4 commit daa4d3c

File tree

1 file changed

+91
-1
lines changed

1 file changed

+91
-1
lines changed

spring-data-redis-experiments/src/test/java/io/vmware/spring/data/redis/tests/repository/RedisRepositoryWithEntityHavingOffsetDateTimePropertyIntegrationTests.java

Lines changed: 91 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,19 +17,27 @@
1717

1818
import static org.assertj.core.api.Assertions.assertThat;
1919

20+
import java.nio.charset.Charset;
21+
import java.nio.charset.StandardCharsets;
2022
import java.time.OffsetDateTime;
23+
import java.time.OffsetTime;
24+
import java.util.List;
2125

2226
import org.junit.jupiter.api.Test;
2327

28+
import org.springframework.beans.BeansException;
2429
import org.springframework.beans.factory.annotation.Autowired;
30+
import org.springframework.beans.factory.config.BeanPostProcessor;
2531
import org.springframework.boot.SpringBootConfiguration;
2632
import org.springframework.boot.autoconfigure.EnableAutoConfiguration;
2733
import org.springframework.boot.autoconfigure.data.redis.RedisProperties;
2834
import org.springframework.boot.test.autoconfigure.data.redis.DataRedisTest;
2935
import org.springframework.context.annotation.Bean;
36+
import org.springframework.core.convert.converter.Converter;
3037
import org.springframework.data.annotation.Id;
3138
import org.springframework.data.redis.connection.RedisConfiguration;
3239
import org.springframework.data.redis.core.RedisHash;
40+
import org.springframework.data.redis.core.convert.RedisCustomConversions;
3341
import org.springframework.data.redis.repository.configuration.EnableRedisRepositories;
3442
import org.springframework.data.repository.CrudRepository;
3543
import org.springframework.lang.NonNull;
@@ -55,6 +63,7 @@
5563
* @see org.springframework.test.context.ContextConfiguration
5664
* @see io.vmware.spring.data.redis.tests.AbstractRedisIntegrationTests
5765
* @see io.vmware.spring.data.redis.tests.repository.RedisRepositoryWithEntityHavingOffsetDateTimePropertyIntegrationTests.RedisTestConfiguration
66+
* @see <a href="https://github.com/spring-projects/spring-data-redis/issues/2677">Jsr310Converters does not contain converters for OffsetTime and OffsetDateTime</a>
5867
* @since 0.1.0
5968
*/
6069
@Getter
@@ -72,8 +81,9 @@ public class RedisRepositoryWithEntityHavingOffsetDateTimePropertyIntegrationTes
7281
void userRepositorySaveAndFindSuccessful() {
7382

7483
OffsetDateTime lastAccessed = OffsetDateTime.now();
84+
OffsetTime timeToLive = OffsetTime.now().plusMinutes(5);
7585

76-
User jonDoe = User.as("Jon Doe").lastAccessed(lastAccessed);
86+
User jonDoe = User.as("Jon Doe").lastAccessed(lastAccessed).timeToLive(timeToLive);
7787

7888
getUserRepository().save(jonDoe);
7989

@@ -83,6 +93,7 @@ void userRepositorySaveAndFindSuccessful() {
8393
assertThat(loadedUser).isNotSameAs(jonDoe);
8494
assertThat(loadedUser.getName()).isEqualTo("Jon Doe");
8595
assertThat(loadedUser.getLastAccessed()).isEqualTo(lastAccessed);
96+
assertThat(loadedUser.getTimeToLive()).isEqualTo(timeToLive);
8697
}
8798

8899
@SpringBootConfiguration
@@ -94,6 +105,78 @@ static class RedisTestConfiguration {
94105
RedisConfiguration redisConfiguration(RedisProperties redisProperties) {
95106
return redisStandaloneConfiguration(redisProperties);
96107
}
108+
109+
@Bean
110+
BeanPostProcessor redisCustomConversionsBeanPostProcess() {
111+
112+
return new BeanPostProcessor() {
113+
114+
@Override
115+
public Object postProcessBeforeInitialization(@NonNull Object bean, @NonNull String beanName) throws BeansException {
116+
117+
return bean instanceof RedisCustomConversions
118+
? new RedisCustomConversions(ApplicationConverters.list())
119+
: bean;
120+
}
121+
};
122+
}
123+
}
124+
125+
static abstract class ApplicationConverters {
126+
127+
static List<?> list() {
128+
return List.of(
129+
new BytesToOffsetDateTimeConverter(),
130+
new BytesToOffsetTimeConverter(),
131+
new OffsetDateTimeToBytesConverter(),
132+
new OffsetTimeToBytesConverter()
133+
);
134+
}
135+
136+
static class StringBasedConverter {
137+
138+
static final Charset CHARSET = StandardCharsets.UTF_8;
139+
140+
byte[] fromString(String source) {
141+
return source.getBytes(CHARSET);
142+
}
143+
144+
String toString(byte[] bytes) {
145+
return new String(bytes, CHARSET);
146+
}
147+
}
148+
149+
static class BytesToOffsetTimeConverter extends StringBasedConverter implements Converter<byte[], OffsetTime> {
150+
151+
@Override
152+
public OffsetTime convert(@NonNull byte[] source) {
153+
return OffsetTime.parse(toString(source));
154+
}
155+
}
156+
157+
static class BytesToOffsetDateTimeConverter extends StringBasedConverter implements Converter<byte[], OffsetDateTime> {
158+
159+
@Override
160+
public OffsetDateTime convert(@NonNull byte[] source) {
161+
return OffsetDateTime.parse(toString(source));
162+
}
163+
}
164+
165+
static class OffsetDateTimeToBytesConverter extends StringBasedConverter implements Converter<OffsetDateTime, byte[]> {
166+
167+
@Override
168+
public byte[] convert(OffsetDateTime source) {
169+
return fromString(source.toString());
170+
}
171+
}
172+
173+
static class OffsetTimeToBytesConverter extends StringBasedConverter implements Converter<OffsetTime, byte[]> {
174+
175+
@Override
176+
public byte[] convert(OffsetTime source) {
177+
return fromString(source.toString());
178+
}
179+
}
97180
}
98181

99182
@Getter
@@ -107,11 +190,18 @@ static class User {
107190

108191
private OffsetDateTime lastAccessed;
109192

193+
private OffsetTime timeToLive;
194+
110195
public @NonNull User lastAccessed(@Nullable OffsetDateTime dateTime) {
111196
this.lastAccessed = dateTime;
112197
return this;
113198
}
114199

200+
public @NonNull User timeToLive(@Nullable OffsetTime time) {
201+
this.timeToLive = time;
202+
return this;
203+
}
204+
115205
@Override
116206
public String toString() {
117207
return getName();

0 commit comments

Comments
 (0)