微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

将 DB 列中的 JSON 字符串转换为 @ReadingConverter

如何解决将 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 举报,一经查实,本站将立刻删除。