{"record":{"id":"9be9eda873ba22c1","repo":"apache/pulsar","slug":"failed-to-serialize-package-metadata-as-json","errorCode":null,"errorMessage":"Failed to serialize package metadata as JSON","messagePattern":"Failed to serialize package metadata as JSON","errorType":"exception","errorClass":"IllegalStateException","httpStatus":null,"severity":"error","filePath":"pulsar-package-management/core/src/main/java/org/apache/pulsar/packages/management/core/common/PackageMetadataUtil.java","lineNumber":68,"sourceCode":"                    + \"java.lang.String;java.lang.Number;java.lang.Long;java.lang.Boolean;\"\n                    + \"java.lang.Object;\"\n                    + \"!*\");\n\n    private static final ObjectReader JSON_READER =\n            ObjectMapperFactory.getMapper().reader().forType(PackageMetadata.class);\n    private static final ObjectWriter JSON_WRITER = ObjectMapperFactory.getMapper().writer();\n\n    private static final AtomicBoolean LEGACY_READ_WARNED = new AtomicBoolean(false);\n\n    private PackageMetadataUtil() {\n    }\n\n    public static byte[] toBytes(PackageMetadata packageMetadata, boolean jsonSerializationEnabled) {\n        if (jsonSerializationEnabled) {\n            try {\n                return JSON_WRITER.writeValueAsBytes(packageMetadata);\n            } catch (IOException e) {\n                throw new IllegalStateException(\"Failed to serialize package metadata as JSON\", e);\n            }\n        }\n        return SerializationUtils.serialize(packageMetadata);\n    }\n\n    public static PackageMetadata fromBytes(byte[] bytes, boolean allowLegacyJavaSerialization)\n            throws MetadataFormatException {\n        if (bytes == null || bytes.length == 0) {\n            throw new MetadataFormatException(\"Empty package metadata\");\n        }\n        int firstNonWhitespace = indexOfFirstNonWhitespace(bytes);\n        if (firstNonWhitespace >= 0 && bytes[firstNonWhitespace] == JSON_LEADING_BYTE) {\n            return readJson(bytes);\n        }\n        if (bytes.length >= 2 && bytes[0] == JAVA_MAGIC_BYTE_0 && bytes[1] == JAVA_MAGIC_BYTE_1) {\n            if (!allowLegacyJavaSerialization) {\n                throw new MetadataFormatException(\n                        \"Package metadata is in legacy Java serialization format but reading it is disabled. \"","sourceCodeStart":50,"sourceCodeEnd":86,"githubUrl":"https://github.com/apache/pulsar/blob/820761864ed8e2a7d2e52dd9763ad2ae117c1395/pulsar-package-management/core/src/main/java/org/apache/pulsar/packages/management/core/common/PackageMetadataUtil.java#L50-L86","documentation":"IllegalStateException thrown by PackageMetadataUtil.toBytes when Jackson's writeValueAsBytes fails to serialize PackageMetadata to JSON (jsonSerializationEnabled=true). Wraps the underlying JsonProcessingException (an IOException).","triggerScenarios":"Calling toBytes(metadata, true) with a PackageMetadata bean Jackson cannot serialize, e.g. a subclass with unsupported property types or a Jackson version mismatch.","commonSituations":"Custom builds that added non-serializable fields to PackageMetadata, missing/incorrect jackson-databind on the classpath, or mixing old clients that pass incompatible metadata objects.","solutions":["Inspect the wrapped cause for the failing property and fix or annotate it in PackageMetadata.","Ensure the standard PackageMetadata class is used unmodified (no extra unserializable fields).","Verify a compatible jackson-databind version is on the classpath.","As a last resort set jsonSerializationEnabled=false, but that uses legacy Java serialization (see related errors)."],"exampleFix":"// before\nclass PackageMetadata { transient Object weirdField; } // non-serializable field\n// after\nclass PackageMetadata { @JsonIgnore private transient Object weirdField; }","handlingStrategy":"try-catch","validationCode":null,"typeGuard":null,"tryCatchPattern":"try {\n    byte[] bytes = PackageMetadataUtil.toBytes(metadata, true);\n} catch (IllegalStateException e) {\n    // Jackson could not serialize; inspect e.getCause() for failing property\n    log.error(\"Package metadata serialization failed\", e.getCause());\n    throw e;\n}","preventionTips":["Keep PackageMetadata limited to Jackson-friendly fields with proper annotations.","Pin a compatible jackson-databind version.","Add a unit test that round-trips PackageMetadata through toBytes/fromBytes.","Avoid custom subclasses of PackageMetadata."],"tags":["serialization","json","jackson","packages"],"backgroundTag":"json-serialization-failed","analyzedSha":"820761864ed8e2a7d2e52dd9763ad2ae117c1395","analyzedAt":"2026-09-06T00:14:20.138Z","contentChangedAt":"2026-09-06T00:14:20.138Z","schemaVersion":2},"datasetVersion":"2026-09-14T05:17:10.506Z"}