База данных H2 Json Полевой Hibernate Конвертер Исключение - PullRequest
1 голос
/ 10 января 2020

Я просто пытаюсь вставить значение json в h2. Затем я хочу вернуть это json значение как объект с конвертером гибернации. Но ошибка выглядит следующим образом:

Мой запрос на вставку:

INSERT INTO log(
id, activities, date)
VALUES (1, '[{"actionType": "EMAIL"}]', '2019-12-10 00:00:00');

Когда я пытаюсь вернуть это поле конвертером гибернации, поле поставляется с кавычкой:

"[{"actionType": "EMAIL"}]"

Но это должно быть:

[{"actionType": "EMAIL"}]

org.springframework.dao.InvalidDataAccessApiUsageException: данное строковое значение: "[{" actionType ":" EMAIL "}]" не может быть преобразовано в Json объект; вложенное исключение: java .lang.IllegalArgumentException: данное строковое значение: "[{" actionType ":" EMAIL "}]" не может быть преобразовано в Json object

Entity:

@Entity
@Table(name = "log")
public class RuleLog
{
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

    @Convert(converter = LogActionConverter.class)
    private List<LogActivity> activities;

    @Column(name = "date")
    private LocalDateTime date;
}

Конвертер:

public class LogActionConverter implements AttributeConverter<List<LogActivity>, String>
{
    private static final Gson gson = new Gson();

    @Override
    public String convertToDatabaseColumn(List<LogActivity> attribute)
    {
        try
        {
            if (attribute == null)
            {
                return null;
            }
            else
            {
                return gson.toJson(attribute);
            }
        }
        catch (Exception ex)
        {
            return null;
        }
    }

    @Override
    public List<LogActivity> convertToEntityAttribute(String dbData)
    {
        try
        {
            if (dbData == null)
            {
                return null;
            }
            else
            {
                return gson.fromJson(dbData, List.class);
            }
        }
        catch (Exception ex)
        {
            return null;
        }
    }
}

1 Ответ

2 голосов
/ 10 января 2020

Как уже было сказано в GitHub , приведение строки символов к JSON создает объект JSON String. Текст JSON должен иметь стандартное предложение FORMAT JSON или быть указан как нестандартный JSON литерал в H2.

-- SQL:2016 compliant
'[{"actionType": "EMAIL"}]' FORMAT JSON
-- or H2-specific
JSON '[{"actionType": "EMAIL"}]'
...