1

我的应用程序使用 Spring Boot、JPA 和 Crnk 框架以及 mariadb 作为数据库。

我有一个这样定义的字段

@Column(name = "baskets", columnDefinition = "TEXT")
@Convert(converter = UUIDListConverter.class)
private List<UUID> baskets;

在 mariadb 它看起来像这样

在此处输入图像描述 在此处输入图像描述

我的映射器是这样写的

@Component
public class UUIDListConverter implements AttributeConverter<List<UUID>, String> {

    @Autowired
    private ObjectMapper objectMapper;

    @Override
    public List<UUID> convertToEntityAttribute(String dbData) {
        try {
            return objectMapper.readValue(dbData, new TypeReference<List<UUID>>() {});
        } catch (JsonProcessingException e) {
            throw new IllegalArgumentException(
                    "Unable to convert attribute JSON from database format: " + e.getMessage(), e);
        }
    }
}

我尝试在 mariadb 中使用以下查询更新篮子的值。我在 mariadb 的 mysql gui 工具中运行了这个查询。

update table_name set baskets = (UUID()) where code = 'XXX';

它将值插入到购物篮列中。插入列中的值是这个

a5cff67a-6098-11ec-9745-acde48001122

但是当我尝试读取列并转换为模型对象时。它给了我以下错误

org.springframework.orm.jpa.JpaSystemException: Error attempting to apply AttributeConverter; nested exception is javax.persistence.PersistenceException: Error attempting to apply AttributeConverter

Caused by: java.lang.IllegalArgumentException: Unable to convert attribute JSON from database format: Unrecognized token 'a5cff67a': was expecting (JSON String, Number, Array, Object or token 'null', 'true' or 'false')
 at [Source: (String)"a5cff67a-6098-11ec-9745-acde48001122"; line: 1, column: 9]
    at util.UUIDListConverter.convertToEntityAttribute(UUIDListConverter.java:34)
    at util.UUIDListConverter.convertToEntityAttribute(UUIDListConverter.java:12)
    at org.hibernate.metamodel.model.convert.internal.JpaAttributeConverterImpl.toDomainValue(JpaAttributeConverterImpl.java:45)
    at org.hibernate.type.descriptor.converter.AttributeConverterSqlTypeDescriptorAdapter$2.doConversion(AttributeConverterSqlTypeDescriptorAdapter.java:140)
    ... 148 more
Caused by: com.fasterxml.jackson.core.JsonParseException: Unrecognized token 'a5cff67a': was expecting (JSON String, Number, Array, Object or token 'null', 'true' or 'false')
 at [Source: (String)"a5cff67a-6098-11ec-9745-acde48001122"; line: 1, column: 9]
  1. 是不是因为购物篮列的数据类型是“文本”。?

2.数据类型应该是“BINARY(16)”来保存UUID值吗?

任何其他建议/帮助

4

1 回答 1

0

1.

是不是因为购物篮列的数据类型是“文本”。?

我怀疑是这样!

我认为:

objectMapper.readValue(dbData, new TypeReference<List<UUID>>() {})

..抛出异常,因为:

  1. 数据(a5cff67a-6098-11ec-9745-acde48001122,没有引号,没有大括号,只是普通的 uuid)看起来不像有效的 json

  2. 即使 ( update table_name set baskets = ('["'||UUID()||'"]') where code = 'XXX';,试图生成有效的 json),objectMapper 应该调用哪个转换器!?!?!;) (->堆栈溢出!)


2.

数据类型是否应为“BINARY (16)”以保存 UUID 值。?

呐!

最好的,可能是:JSON


任何其他建议/帮助

  • 将(仅)有效的 json 放入数据库。
  • (测试)省略/删除/忘记(至少重新考虑)您的转换器,尝试杰克逊如何处理这个问题。
于 2021-12-19T14:37:21.910 回答