Java 如何使用Micronaut framework在Redis中存储POJO?

Java 如何使用Micronaut framework在Redis中存储POJO?,java,redis,micronaut,Java,Redis,Micronaut,我是Micronaut的新手。我正在尝试将一个项目移植到Micronaut(v1.1.1),我发现Redis存在一个问题 我只是想在Redis中保存一个简单的POJO,但当我试图“保存”它时,会出现以下错误: io.lettuce.core.RedisException: io.netty.handler.codec.EncoderException: Cannot encode command. Please close the connection as the connection sta

我是Micronaut的新手。我正在尝试将一个项目移植到Micronaut(v1.1.1),我发现Redis存在一个问题

我只是想在Redis中保存一个简单的POJO,但当我试图“保存”它时,会出现以下错误:

io.lettuce.core.RedisException: io.netty.handler.codec.EncoderException: Cannot encode command. Please close the connection as the connection state may be out of sync.
代码非常简单(您可以找到完整的测试):

class-DummyTest{
@试验
public void testIssue()引发异常{
final Date now=Date.from(Instant.now());
CatalogContent expectedContentOne=CatalogContent.builder()
.contentId(1)
.status(ContentStatus.AVAILABLE)
.名称(“uno”)
.streamId(1)
。可供选择(现在)
.标记(一组(“标记1”、“标记2”))
.build();
repository.save(expectedContentOne);
}
}
/.../
类CatalogContentRepository{
私有状态重新连接;
公共CatalogContentRepository(StatefulRedisConnection){
这个连接=连接;
} 
公共作废保存(目录内容){
RedisCommands redisApi=connection.sync();
redisApi.set(String.valueOf(content.getContentId()),content);//此处出错!
}
}
任何想法都会受到欢迎


提前谢谢。

为了记录在案,我将回答我自己的问题:

目前(20190514)Micronaut仅使用硬编码UTF8字符串编解码器生成
StatefulRedisConnection
。 要更改此设置,您必须替换
DefaultRedisClientFactory
,并定义一个返回所需
StatefulRedisConnection
的方法, 使用您喜欢的编解码器

就我而言:

@需要(bean=DefaultRedisConfiguration.class)
@独生子女
@工厂
@替换(factory=DefaultRedisClientFactory.class)
公共类RedisClientFactory扩展了AbstractRedisClientFactory{
@Bean(preDestroy=“shutdown”)
@独生子女
@初级的
@凌驾
公共RedisClient RedisClient(@Primary AbstractRedisConfiguration config){
返回super.redisClient(config);
}
@Bean(preDestroy=“close”)
@独生子女
@初级的
public StatefulRedisConnection myRedisConnection(@Primary RedisClient RedisClient){
返回redisClient.connect(新的SerializedObjectCodec());
}
@Bean(preDestroy=“close”)
@独生子女
@初级的
@凌驾
public StatefulRedisConnection redisConnection(@Primary RedisClient RedisClient){
抛出新的RuntimeException(“puta mierda”);
}
@凌驾
@Bean(preDestroy=“close”)
@独生子女
public StatefulRedisPubSubConnection redisPubSubConnection(@Primary RedisClient RedisClient){
返回super.redisPubSubConnection(redisClient);
}
}
编解码器已从

公共类SerializedObjectCodec实现RedisCodec{
私有字符集Charset=Charset.forName(“UTF-8”);
@凌驾
公共字符串解码密钥(字节缓冲字节){
返回charset.decode(字节).toString();
}
@凌驾
公共对象解码值(字节缓冲字节){
试一试{
byte[]数组=新字节[bytes.remaining()];
get(数组);
ObjectInputStream is=新的ObjectInputStream(新的ByteArrayInputStream(数组));
返回值为.readObject();
}捕获(例外e){
返回null;
}
}
@凌驾
公用ByteBuffer编码键(字符串键){
返回字符集编码(键);
}
@凌驾
公共字节缓冲编码值(对象值){
试一试{
ByteArrayOutputStream字节=新建ByteArrayOutputStream();
ObjectOutputStream os=新的ObjectOutputStream(字节);
os.writeObject(值);
返回ByteBuffer.wrap(bytes.toByteArray());
}捕获(IOE异常){
返回null;
}
}
}