如何解决将 DB 列中的 JSON 字符串转换为 @ReadingConverter
如何将存储在 DB 列中的 JSON String
转换为实体类 Map<String,?>
中定义的 Product
属性?
我已经定义了一个 @ReadingConverter JsonToMapConverter
类和一个 ProductRepository
。调用 productRepository.findAll()
会引发错误 org.springframework.data.mapping.MappingException: Couldn't find PersistentEntity for type class java.lang.Object!
@Table("product")
public class Product {
@Id
private BigInteger id;
private String Map<String,?> MetaData;
// Getters / Setters here
}
@ReadingConverter
public class JsonToMapConverter implements Converter<String,Map<String,?>> {
private static final ObjectMapper objectMapper = new ObjectMapper();
@SneakyThrows
@Override
public Map<String,?> convert(String s) {
return objectMapper.readValue(s,Map.class);
}
}
@Repository
public interface ProductRepository extends CrudRepository<Product,BigInteger> {}
@SpringBoottest
class ProductTest {
@Autowired
private ProductRepository productRepository;
@Test
public void fetchProducts() {
// Throws org.springframework.data.mapping.MappingException: Couldn't find PersistentEntity for type class java.lang.Object!
productRepository.findAll();
}
}
MysqL> select * from product;
+----+-----------+
| id | Meta_data |
+----+-----------+
| 1 | {} |
+----+-----------+
解决方法
查看帖子,我可以推断出您正在尝试将 String 转换为 Map,反之亦然,以便在数据库中读取和存储。
这是一个在这种情况下可能有用的示例代码。
@Converter
public class StringMapConverter implements AttributeConverter<Map<String,String>,String> {
private static final ObjectMapper mapper = new ObjectMapper();
@SneakyThrows(IOException.class)
@Override
public String convertToDatabaseColumn(Map<String,String> data) {
if (null == data) {
return "{}";
}
return mapper.writeValueAsString(data);
}
@SneakyThrows(IOException.class)
@Override
public Map<String,String> convertToEntityAttribute(String s) {
if (null == s) {
return new HashMap<>();
}
return mapper.readValue(s,new TypeReference<>() {
});
}
}
此外,为了使用它,在字段级别的实体类中需要一个 Annotaion。
所以它会变成这样。
@Table("product")
public class Product {
@Id
private BigInteger id;
@Convert(converter = StringMapConverter.class)
private String Map<String,?> metaData;
// Getters / Setters here
}
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。