Micronaut JSONB 字段

问题描述 投票:0回答:1

我有使用 Postgres DB 的 micronaut 应用程序。最近我需要将 JSONB 字段添加到我的表中。

但是我找不到适合我的案例的任何可行解决方案。这是我的代码:

import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.ObjectMapper;
import jakarta.inject.Singleton;
import jakarta.persistence.AttributeConverter;
import jakarta.persistence.Converter;
import lombok.RequiredArgsConstructor;

import java.io.IOException;
import java.util.List;

@Singleton
@RequiredArgsConstructor
@Converter(autoApply = true)
public class JsonbConverter implements AttributeConverter<List<Metadata>, String> {

    private final ObjectMapper objectMapper;

    @Override
    public String convertToDatabaseColumn(List<Metadata> attribute) {
        try {
            return attribute == null ? null : objectMapper.writeValueAsString(attribute);
        } catch (JsonProcessingException e) {
            throw new RuntimeException("Error converting to JSON", e);
        }
    }

    @Override
    public List<Metadata> convertToEntityAttribute(String dbData) {
        try {
            return dbData == null ? null : objectMapper.readValue(dbData,
                objectMapper.getTypeFactory().constructCollectionType(List.class, Metadata.class));
        } catch (IOException e) {
            throw new RuntimeException("Error parsing JSON", e);
        }
    }
}

这是我的元数据。顺便说一下,我尝试了Map和Map。没有任何效果。

@Data
@Introspected
@JsonInclude(JsonInclude.Include.NON_NULL)
@Schema(title = METADATA_TITLE, description = METADATA_DESCRIPTION)
public class Metadata {

    @NotBlank
    @Size(min = 1, max = 1000)
    private String field;

    @NotBlank
    @Size(min = 1, max = 1000)
    private String value;

    @JsonCreator
    public Metadata(@JsonProperty("field") String field,
                    @JsonProperty("value") String value) {
        this.field = field;
        this.value = value;
    }

}

这是我存储字段的实体对象:

@Value
@Embeddable
class StoredIndexingDetails {

 
    @Nullable
//    @Convert(converter = JsonbConverter.class)
    @TypeDef(type = DataType.JSON, converter = JsonbConverter.class)
//    @Column(name = "indexing_primary_metadata", columnDefinition = "jsonb")
    List<Metadata> primaryMetadata;
}

如前所述,尝试了不同的方法。尝试添加

@Column(name = "indexing_primary_metadata", columnDefinition = "jsonb")

接下来是我的错误:

Error executing PERSIST: ERROR: column \"indexing_primary_metadata\" is of type jsonb but expression is of type character varying\n  Hint: You will need to rewrite or cast the expression.

我也尝试添加

@ColumnTransformer(write = "?::jsonb")
代码没有抛出错误,但 db 字段为空。 有什么建议吗?

java postgresql jsonb micronaut micronaut-data
1个回答
0
投票

我已经成功解决了这个问题。 所以,基本上,我的 @TypeDef(type = DataType.JSON, converter = JsonbConverter.class) 解决方案似乎有效。 我在表中收到 null 的原因是因为在我的代码中,由于嵌套实体的问题,该字段为 null。

对于那些试图寻找解决方案的人:

@Column(columnDefinition = "json", name = "test_field")
@TypeDef(type = DataType.JSON, converter = JsonbConverter.class)
final List<Metadata> testField;

以上应该有效。 JsonbConverter 的代码有问题。

© www.soinside.com 2019 - 2024. All rights reserved.