Skip to content

StringPrimitive not serializable breaking EHRbase HA deployments #693

@subigre

Description

@subigre

Before reporting an issue

  • I have searched existing issues
  • I have reproduced the issue with the latest release

Environment information

{
  "ehrbase_version": "2.24.0",
  "openehr_sdk_version": "2.27.0",
  "archie_version": "3.13.0",
  "jvm_version": "Eclipse Adoptium 21.0.8+9-LTS",
  "os_version": "Linux amd64 6.8.0-53-generic",
  "postgres_version": "PostgreSQL 17.6 on x86_64-pc-linux-gnu, compiled by gcc (Debian 12.2.0-14+deb12u1) 12.2.0, 64-bit"
}

Steps to reproduce

  1. Deploy the latest EHRbase version using Redis for caching.
    # ...
    spring:
      cache:
        type: redis
      data:
        redis:
          host: redis
          port: 6379
  2. Upload a template using: POST http://localhost:8080/ehrbase/rest/openehr/v1/definition/template/adl1.4

Alternative:

  1. Run the following main class
package org.ehrbase.test;

import org.ehrbase.openehr.sdk.webtemplate.model.WebTemplate;
import org.ehrbase.openehr.sdk.webtemplate.parser.OPTParser;
import org.openehr.schemas.v1.OPERATIONALTEMPLATE;
import org.openehr.schemas.v1.TemplateDocument;
import org.springframework.core.io.ClassPathResource;

import java.io.FileOutputStream;
import java.io.IOException;
import java.io.ObjectOutputStream;

public class WebTemplateSerialization {

    public static void main(String[] args) {
        ClassPathResource resource = new ClassPathResource("KDS_Diagnose.opt");

        TemplateDocument document;
        try {
            document = TemplateDocument.Factory.parse(resource.getInputStream());
        } catch (Exception ex) {
            throw new IllegalArgumentException("Failed to parse template", ex);
        }

        OPERATIONALTEMPLATE operationalTemplate = document.getTemplate();

        WebTemplate webTemplate = new OPTParser(operationalTemplate).parse();

        try (ObjectOutputStream os = new ObjectOutputStream(new FileOutputStream("template.dat"))) {
            os.writeObject(webTemplate);
        } catch (IOException ex) {
            throw new IllegalStateException("Failed to serialize web template", ex);
        }
    }
}

Expected behavior

Template should be uploaded and added into the cache.

Actual result

ehrbase-ehrbase-8c6dcdb9-hxlfj-ehrbase.log

> Task :org.ehrbase.test.WebTemplateSerialization.main() FAILED
Exception in thread "main" java.lang.IllegalStateException: Failed to serialize web template
	at org.ehrbase.test.WebTemplateSerialization.main(WebTemplateSerialization.java:32)
Caused by: java.io.NotSerializableException: org.ehrbase.openehr.sdk.aql.dto.operand.StringPrimitive
	at java.base/java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1200)
	at java.base/java.io.ObjectOutputStream.defaultWriteFields(ObjectOutputStream.java:1585)
	at java.base/java.io.ObjectOutputStream.writeSerialData(ObjectOutputStream.java:1542)
	at java.base/java.io.ObjectOutputStream.writeOrdinaryObject(ObjectOutputStream.java:1451)
	at java.base/java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1194)
Caused by: java.io.NotSerializableException: org.ehrbase.openehr.sdk.aql.dto.operand.StringPrimitive

	at java.base/java.io.ObjectOutputStream.writeObject(ObjectOutputStream.java:358)
	at java.base/java.util.CollSer.writeObject(ImmutableCollections.java:1472)
	at java.base/jdk.internal.reflect.DirectMethodHandleAccessor.invoke(DirectMethodHandleAccessor.java:103)
	at java.base/java.lang.reflect.Method.invoke(Method.java:580)
	at java.base/java.io.ObjectStreamClass.invokeWriteObject(ObjectStreamClass.java:1072)
	at java.base/java.io.ObjectOutputStream.writeSerialData(ObjectOutputStream.java:1529)
	at java.base/java.io.ObjectOutputStream.writeOrdinaryObject(ObjectOutputStream.java:1451)
	at java.base/java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1194)
	at java.base/java.io.ObjectOutputStream.defaultWriteFields(ObjectOutputStream.java:1585)
	at java.base/java.io.ObjectOutputStream.writeSerialData(ObjectOutputStream.java:1542)
	at java.base/java.io.ObjectOutputStream.writeOrdinaryObject(ObjectOutputStream.java:1451)
	at java.base/java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1194)
	at java.base/java.io.ObjectOutputStream.defaultWriteFields(ObjectOutputStream.java:1585)
	at java.base/java.io.ObjectOutputStream.writeSerialData(ObjectOutputStream.java:1542)
	at java.base/java.io.ObjectOutputStream.writeOrdinaryObject(ObjectOutputStream.java:1451)
	at java.base/java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1194)
	at java.base/java.io.ObjectOutputStream.writeArray(ObjectOutputStream.java:1394)
	at java.base/java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1190)
	at java.base/java.io.ObjectOutputStream.defaultWriteFields(ObjectOutputStream.java:1585)
	at java.base/java.io.ObjectOutputStream.writeSerialData(ObjectOutputStream.java:1542)
	at java.base/java.io.ObjectOutputStream.writeOrdinaryObject(ObjectOutputStream.java:1451)
	at java.base/java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1194)
	at java.base/java.io.ObjectOutputStream.defaultWriteFields(ObjectOutputStream.java:1585)
	at java.base/java.io.ObjectOutputStream.writeSerialData(ObjectOutputStream.java:1542)
	at java.base/java.io.ObjectOutputStream.writeOrdinaryObject(ObjectOutputStream.java:1451)
	at java.base/java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1194)
	at java.base/java.io.ObjectOutputStream.writeObject(ObjectOutputStream.java:358)
	at java.base/java.util.ArrayList.writeObject(ArrayList.java:948)
	at java.base/jdk.internal.reflect.DirectMethodHandleAccessor.invoke(DirectMethodHandleAccessor.java:103)
	at java.base/java.lang.reflect.Method.invoke(Method.java:580)
	at java.base/java.io.ObjectStreamClass.invokeWriteObject(ObjectStreamClass.java:1072)
	at java.base/java.io.ObjectOutputStream.writeSerialData(ObjectOutputStream.java:1529)
	at java.base/java.io.ObjectOutputStream.writeOrdinaryObject(ObjectOutputStream.java:1451)
	at java.base/java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1194)
	at java.base/java.io.ObjectOutputStream.defaultWriteFields(ObjectOutputStream.java:1585)
	at java.base/java.io.ObjectOutputStream.writeSerialData(ObjectOutputStream.java:1542)
	at java.base/java.io.ObjectOutputStream.writeOrdinaryObject(ObjectOutputStream.java:1451)
	at java.base/java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1194)
	at java.base/java.io.ObjectOutputStream.writeObject(ObjectOutputStream.java:358)
	at java.base/java.util.ArrayList.writeObject(ArrayList.java:948)
	at java.base/jdk.internal.reflect.DirectMethodHandleAccessor.invoke(DirectMethodHandleAccessor.java:103)
	at java.base/java.lang.reflect.Method.invoke(Method.java:580)
	at java.base/java.io.ObjectStreamClass.invokeWriteObject(ObjectStreamClass.java:1072)
	at java.base/java.io.ObjectOutputStream.writeSerialData(ObjectOutputStream.java:1529)
	at java.base/java.io.ObjectOutputStream.writeOrdinaryObject(ObjectOutputStream.java:1451)
	at java.base/java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1194)
	at java.base/java.io.ObjectOutputStream.defaultWriteFields(ObjectOutputStream.java:1585)
	at java.base/java.io.ObjectOutputStream.writeSerialData(ObjectOutputStream.java:1542)
	at java.base/java.io.ObjectOutputStream.writeOrdinaryObject(ObjectOutputStream.java:1451)
	at java.base/java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1194)
	at java.base/java.io.ObjectOutputStream.defaultWriteFields(ObjectOutputStream.java:1585)
	at java.base/java.io.ObjectOutputStream.writeSerialData(ObjectOutputStream.java:1542)
	at java.base/java.io.ObjectOutputStream.writeOrdinaryObject(ObjectOutputStream.java:1451)
	at java.base/java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1194)
	at java.base/java.io.ObjectOutputStream.writeObject(ObjectOutputStream.java:358)
	at org.ehrbase.test.WebTemplateSerialization.main(WebTemplateSerialization.java:30)

Further information

No response

Metadata

Metadata

Assignees

No one assigned

    Labels

    bugSomething isn't working

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions