java - Eclipselink 持久性转换器未调用

标签 java spring-boot eclipselink

我想创建一个 org.eclipse.persistence.mappings.converters.Converter 将 POJO 转换为 JSON。我这样做是为了将其存储在 Postgres jsonb 字段中。 这在 Spring Boot 1.5.14 中运行良好。新项目基于 Spring Boot 2.0.2,代码不再工作。不再调用转换器,这会导致数据库出现类型错误。

import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.core.type.TypeReference;
import com.fasterxml.jackson.databind.ObjectMapper;
import org.eclipse.persistence.mappings.DatabaseMapping;
import org.eclipse.persistence.sessions.Session;
import org.postgresql.util.PGobject;

import java.io.IOException;
import java.sql.SQLException;

public class MetadataConverter implements org.eclipse.persistence.mappings.converters.Converter {
    private ObjectMapper mapper = new ObjectMapper();

    @Override
    public Object convertObjectValueToDataValue(Object o, Session session) {
        try {
            PGobject out = new PGobject();
            out.setType("jsonb");
            out.setValue(mapper.writeValueAsString(o));
            return out;
        } catch (SQLException e) {
            throw new IllegalArgumentException("Unable to serialize to json field ", e);
        } catch (JsonProcessingException e) {
            e.printStackTrace();
            throw new IllegalArgumentException("Unable to serialize to json field ", e);
        }

    }

    @Override
    public Metadata convertDataValueToObjectValue(Object o, Session session) {
        if (o == null) {
            return null;
        }

        try {
            if (o instanceof PGobject) {
                return mapper.readValue(((PGobject) o).getValue(), new TypeReference<Metadata>(){});
            } else {
                return mapper.readValue((String) o, new TypeReference<Metadata>(){});
            }

        } catch (IOException | ClassCastException e) { 
            throw new IllegalArgumentException("Unable to deserialize to json field ");
        }
    }

    @Override
    public boolean isMutable() {
        return false;
    }

    @Override
    public void initialize(DatabaseMapping databaseMapping, Session session) {
    }
}

这是模型:

...

@Data
@Entity
@JsonIgnoreProperties(ignoreUnknown = true)
@Table(name = "MY_TEST")
public class TestModel implements Serializable{

    @Id
    String id;

    @Column(columnDefinition = "jsonb")
    @Converter(converterClass = MetadataConverter.class, name = "metadataJsonConverter")
    @org.eclipse.persistence.annotations.Convert("metadataJsonConverter")
    Metadata metadata;
}

在两个项目中,eclipslink 版本都是 2.6.3,Postgres 版本在旧项目 9.4.1212.jre7(已计划更新)和新项目 42.2.2 中

有人知道发生了什么变化吗?

最诚挚的问候

卢卡斯

最佳答案

JpaConfiguration 不正确,扩展 JpaBaseConfiguration 解决了问题:

@Configuration
public class JpaConfiguration extends JpaBaseConfiguration {
    protected JpaConfiguration(DataSource dataSource, JpaProperties properties,
                               ObjectProvider<JtaTransactionManager> jtaTransactionManagerProvider,
                               ObjectProvider<TransactionManagerCustomizers> transactionManagerCustomizers) {
        super(dataSource, properties, jtaTransactionManagerProvider, transactionManagerCustomizers);
    }

    @Override
    protected AbstractJpaVendorAdapter createJpaVendorAdapter() {
        return new EclipseLinkJpaVendorAdapter();
    }

    @Override
    protected Map<String, Object> getVendorProperties() {
        final HashMap<String, Object> map = new HashMap<>();
        map.put(PersistenceUnitProperties.WEAVING, detectWeavingMode());
        map.put(PersistenceUnitProperties.VALIDATION_MODE, ValidationMode.NONE.toString());
        return map;
    }

    private String detectWeavingMode() {
        return InstrumentationLoadTimeWeaver.isInstrumentationAvailable() ? "true" : "static";
    }
}

关于java - Eclipselink 持久性转换器未调用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51190275/

相关文章:

java - 持久化无法识别实体类

java - RDF/XML 中的动态数组

java - 在Itext7中,我如何遍历一个字符串并查看我当前的字体是否可以正确显示该字符串?

java - 创建 CSV 文件而不将其保存到文件系统中

java - JPA : OneToMany relationship keeps the Collection empty

java - 初始 SessionFactory 创建失败。javax.persistence.PersistenceException

java - 如何通过编译Java文件修复错误

Java Regular Expression ReplaceAll with Regex 结果修剪定界符前后的空白

sql-server - 如何在 H2 中初始化 View

java - 如何在jpql中为in-clause设置集合项?