2

我们正在尝试使用 Oracle 和基于 Hibernate/JPA(非弹簧)的应用程序来设置 javers 2.2.2。

使用内部存储库和标准(非事务性)构建器时,我能够成功记录和检索审计对象。但是,当我在切换到带有 SQL 的事务生成器后进行保存时,我得到了下面的堆栈跟踪。如果重要的话,我们确实在做 Hibernate Access Hook。

任何帮助是极大的赞赏!

java.lang.UnsupportedOperationException: Attempted to serialize java.lang.Class: org.hibernate.proxy.HibernateProxy. Forgot to register a type adapter? at com.google.gson.internal.bind.TypeAdapters$1.write(TypeAdapters.java:76) at com.google.gson.internal.bind.TypeAdapters$1.write(TypeAdapters.java:69) at com.google.gson.internal.bind.TypeAdapterRuntimeTypeWrapper.write(TypeAdapterRuntimeTypeWrapper.java:68) at com.google.gson.internal.bind.ArrayTypeAdapter.write(ArrayTypeAdapter.java:93) at com.google.gson.internal.bind.TypeAdapterRuntimeTypeWrapper.write(TypeAdapterRuntimeTypeWrapper.java:68) at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory$1.write(ReflectiveTypeAdapterFactory.java:113) at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory$Adapter.write(ReflectiveTypeAdapterFactory.java:240) at com.google.gson.internal.bind.TypeAdapterRuntimeTypeWrapper.write(TypeAdapterRuntimeTypeWrapper.java:68) at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory$1.write(ReflectiveTypeAdapterFactory.java:113) at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory$Adapter.write(ReflectiveTypeAdapterFactory.java:240) at com.google.gson.internal.bind.TypeAdapterRuntimeTypeWrapper.write(TypeAdapterRuntimeTypeWrapper.java:68) at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory$1.write(ReflectiveTypeAdapterFactory.java:113) at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory$Adapter.write(ReflectiveTypeAdapterFactory.java:240) at com.google.gson.internal.bind.TypeAdapterRuntimeTypeWrapper.write(TypeAdapterRuntimeTypeWrapper.java:68) at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory$1.write(ReflectiveTypeAdapterFactory.java:113) at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory$Adapter.write(ReflectiveTypeAdapterFactory.java:240) at com.google.gson.internal.bind.TypeAdapterRuntimeTypeWrapper.write(TypeAdapterRuntimeTypeWrapper.java:68) at com.google.gson.internal.bind.CollectionTypeAdapterFactory$Adapter.write(CollectionTypeAdapterFactory.java:97) at com.google.gson.internal.bind.CollectionTypeAdapterFactory$Adapter.write(CollectionTypeAdapterFactory.java:61) at com.google.gson.internal.bind.TypeAdapterRuntimeTypeWrapper.write(TypeAdapterRuntimeTypeWrapper.java:68) at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory$1.write(ReflectiveTypeAdapterFactory.java:113) at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory$Adapter.write(ReflectiveTypeAdapterFactory.java:240) at com.google.gson.internal.bind.ObjectTypeAdapter.write(ObjectTypeAdapter.java:107) at com.google.gson.internal.bind.TypeAdapterRuntimeTypeWrapper.write(TypeAdapterRuntimeTypeWrapper.java:68) at com.google.gson.internal.bind.CollectionTypeAdapterFactory$Adapter.write(CollectionTypeAdapterFactory.java:97) at com.google.gson.internal.bind.CollectionTypeAdapterFactory$Adapter.write(CollectionTypeAdapterFactory.java:61) at com.google.gson.Gson.toJson(Gson.java:652) at com.google.gson.Gson.toJsonTree(Gson.java:545) at com.google.gson.Gson.toJsonTree(Gson.java:524) at com.google.gson.Gson$2.serialize(Gson.java:137) at org.javers.core.json.typeadapter.commit.CdoSnapshotStateTypeAdapter.toJson(CdoSnapshotStateTypeAdapter.java:31) at org.javers.core.json.typeadapter.commit.CdoSnapshotStateTypeAdapter.toJson(CdoSnapshotStateTypeAdapter.java:14) at org.javers.core.json.JsonConverterBuilder$1.serialize(JsonConverterBuilder.java:124) at com.google.gson.TreeTypeAdapter.write(TreeTypeAdapter.java:70) at com.google.gson.TreeTypeAdapter.write(TreeTypeAdapter.java:63) at com.google.gson.Gson.toJson(Gson.java:652) at com.google.gson.Gson.toJson(Gson.java:631) at com.google.gson.Gson.toJson(Gson.java:586) at com.google.gson.Gson.toJson(Gson.java:566) at org.javers.core.json.JsonConverter.toJson(JsonConverter.java:55) at org.javers.repository.sql.repositories.CdoSnapshotRepository.insertSnapshot(CdoSnapshotRepository.java:37) at org.javers.repository.sql.repositories.CdoSnapshotRepository.save(CdoSnapshotRepository.java:27) at org.javers.repository.sql.JaversSqlRepository.persist(JaversSqlRepository.java:63) at org.javers.repository.api.JaversExtendedRepository.persist(JaversExtendedRepository.java:109) at org.javers.core.JaversCore.commit(JaversCore.java:79) at org.javers.core.JaversCore.commit(JaversCore.java:64) at org.javers.spring.jpa.JaversTransactionalDecorator.commit(JaversTransactionalDecorator.java:53)

4

2 回答 2

0

该错误表明您正在尝试提交HibernateProxy。在运行时,Hibernate 将您的域对象和集合包装在代理对象中,主要用于延迟加载。所以你的域对象变得有点。在提交 javers 之前,您必须解开它们。

Javers 为此提供了专用的钩子 - HibernateUnproxyObjectAccessHook

TransactionalJaversBuilder
    .javers().withObjectAccessHook(new HibernateUnproxyObjectAccessHook()).build()

有关更多详细信息,请参见http://javers.org/documentation/spring-integration/#hibernate-unproxy-hook

于 2016-09-13T17:15:06.003 回答
0

尝试通过ObjectMapper解析为

    MyClass myClass = new MyClass();
    return new ObjectMapper().writeValueAsString(myClass);
于 2020-10-15T07:43:17.063 回答