У меня есть объект с атрибутом, который я хочу сериализовать как JSON:
@Entity
public class Flujo implements Serializable {
...
@Column(length = 5000)
@Convert(converter = FASSignatureBlockArrayConverter.class)
public FirmaAsyncSimpleSignatureBlock[] getBloquesFirmas() {
return this.bloquesFirma;
}
public void setBloquesFirmas(FirmaAsyncSimpleSignatureBlock[] bloquesFirma) {
this.bloquesFirma = bloquesFirma;
}
}
, конвертер реализован следующим образом
@Converter(autoApply = true)
public class FASSignatureBlockArrayConverter
implements AttributeConverter<FirmaAsyncSimpleSignatureBlock[], String> {
private final static Logger LOG =
Logger.getLogger(
FASSignatureBlockArrayConverter.class.getName());
public String convertToDatabaseColumn(FirmaAsyncSimpleSignatureBlock[] signatureBlocks) {
LOG.info("Convirtiendo a JSON");
if (signatureBlocks == null) {
return null;
}
var mapper = new ObjectMapper();
try {
return mapper.writeValueAsString(signatureBlocks);
} catch (JsonProcessingException jpe) {
LOG.log(
Level.WARNING,
"Converter, error convirtiendo to JSON",
jpe);
throw new RuntimeException("Error convirtiendo FirmaAsyncSimpleSignatureBlock[] a JSON", jpe);
}
}
public FirmaAsyncSimpleSignatureBlock[] convertToEntityAttribute(String dbData) {
LOG.info("Convirtiendo desde JSON " + dbData);
if ((dbData == null) || dbData.isBlank()) {
return null;
}
var mapper = new ObjectMapper();
try {
var resultado =
mapper.readValue(dbData, FirmaAsyncSimpleSignatureBlock[].class);
LOG.info("Returning array of size " + resultado.length);
return resultado;
} catch (JsonParseException | JsonMappingException e) {
LOG.log(
Level.WARNING,
"Converter, error convirtiendo desde JSON",
e);
throw new RuntimeException("Error JSON a FirmaAsyncSimpleSignatureBlock[]", e);
} catch (IOException e) {
LOG.log(
Level.WARNING,
"Converter, IO error convirtiendo desde JSON",
e);
throw new RuntimeException("Error IO convirtiendo de JSON a FirmaAsyncSimpleSignatureBlock[]", e);
}
}
}
Когда я пытаюсь сохранить бин с массивом длины 0, все работает нормально.
Когда я пытаюсь сохранить бин с массивом длины 1, подняв экземпляр на позицию 0, я получаю
14: 51: 26 173 ИНФОРМАЦИЯ [es.ssib.oti c .jpa.beans.converters.FASSignatureBlockArrayConverter] (Пул потоков ServerService - 113) Подтверждение JSON
14: 51: 26 177 ИНФОРМАЦИЯ [es .ssib.oti c .jpa.beans.converters.FASSignatureBlockArrayConverter] (Пул потоков ServerService - 113) Convirtiendo desde JSON [{"imumNumberOfSignaturesRequired ": 0," signers ": null}]
14:51 : 26,183 INFO [es.ssib.oti c .jpa.beans.converters.FASSignatureBlockArrayConverter] (Пул потоков ServerService - 113) Возвращение массива размера 1
14: 51: 26,190 ОШИБКА [org.jboss.ms c .service.fail] (Пул потоков ServerService - 113) MSC000001: Ошибка t o запустить службу jboss.deployment.unit. "frontend.war" .undertow-deploy:
org.jboss.ms c .service.StartException в службе jboss.deployment.unit. "frontend.war" .undertow- развертывание: java .lang.RuntimeException: javax.persistence.PersistenceException:
org.hibernate.type.SerializationException: не удалось сериализовать
в org.wildfly.extension. undertow@18.0.1.Final//org.wildfly.extension.undertow.deployment.UndertowDeploymentService $ 1.run (UndertowDeploymentService. java: 81)
в java .base / java .util.concurrent.Executors $ RunnableAdapter.call (Executors. java: 515)
в java .base / java .util.concurrent.FutureTask.run (FutureTask. java: 264)
в org.jboss. threads@2.3.3.Final//org.jboss.threads.ContextClassLoaderSavingRunnable.run (ContextClassLoaderSavingRunnable. java: 35)
в org.jboss. threads@2.3.3.Final//org.jboss.threads.EnhancedQueueExecutor.safeRun (расширенный Queueecutor . java: 1982)
at org.jboss. threads@2.3.3.Final//org.jboss.threads.EnhancedQueueExecutor $ ThreadBody.doRunTask (EnhancedQueueExecutor. java: 1486)
...
Причина: java .io.NotSerializableException : org.fundaciobit.apisib.apifirmaasyncsimple.v2.beans.FirmaAsyncSimpleSignatureBlock
Как я могу решить эту проблему? Очевидно, что конвертер работает должным образом, он не выдает никаких исключений и возвращает ожидаемые значения.
Я использую JPA поверх WildFly 18.0.0.1, который использует реализацию Hibernate.
Обновление 1: я изменил свое свойство на FirmaAsyncSimpleSignatureBlock вместо FirmaAsyncSimpleSignatureBlock [] (и я действительно адаптировал конвертер), и оно работало без каких-либо проблем. Обновление 2: работая над обновлением 1, я создал bean-компонент-обертку, который просто содержал свойство FirmaAsyncSimpleSignatureBlock [] , и создал для него конвертер, и он работает безупречно; Я не знаю, является ли это ошибкой Hibernate с массивами или я должен указать, что атрибут является массивом по-другому. И пока этот обходной путь работает для меня, я наклейка для чистого кода, поэтому я все еще работаю для правильного ответа.