{"record":{"id":"a4db4fbcbbad2e95","repo":"hibernate/hibernate-orm","slug":"illegal-xml-for-array","errorCode":null,"errorMessage":"Illegal XML for array: ","messagePattern":"Illegal XML for array: ","errorType":"exception","errorClass":"IllegalArgumentException","httpStatus":null,"severity":"error","filePath":"hibernate-core/src/main/java/org/hibernate/type/descriptor/jdbc/XmlHelper.java","lineNumber":324,"sourceCode":"\t\t\treturn (X) instantiate( embeddableMappingType, attributeValues );\n\t\t}\n\t\t//noinspection unchecked\n\t\treturn (X) array;\n\t}\n\n\tpublic static <X> X arrayFromString(\n\t\t\tJavaType<X> javaType,\n\t\t\tXmlArrayJdbcType xmlArrayJdbcType,\n\t\t\tString string,\n\t\t\tWrapperOptions options) throws SQLException {\n\t\tif ( string == null ) {\n\t\t\treturn null;\n\t\t}\n\t\telse if ( EMPTY_COLLECTION_TAG.equals( string ) ) {\n\t\t\treturn javaType.wrap( Collections.emptyList(), options );\n\t\t}\n\t\telse if ( !string.startsWith( COLLECTION_START_TAG ) || !string.endsWith( COLLECTION_END_TAG ) ) {\n\t\t\tthrow new IllegalArgumentException( \"Illegal XML for array: \" + string );\n\t\t}\n\t\tfinal JavaType<?> elementJavaType = ((BasicPluralJavaType<?>) javaType).getElementJavaType();\n\t\tfinal Class<?> preferredJavaTypeClass = xmlArrayJdbcType.getElementJdbcType().getPreferredJavaTypeClass( options );\n\t\tfinal JavaType<?> jdbcJavaType;\n\t\tif ( preferredJavaTypeClass == null || preferredJavaTypeClass == elementJavaType.getJavaTypeClass() ) {\n\t\t\tjdbcJavaType = elementJavaType;\n\t\t}\n\t\telse {\n\t\t\tjdbcJavaType = options.getTypeConfiguration().getJavaTypeRegistry().resolveDescriptor( preferredJavaTypeClass );\n\t\t}\n\t\tfinal ArrayList<Object> arrayList = new ArrayList<>();\n\t\tfinal int end = fromArrayString(\n\t\t\t\tstring,\n\t\t\t\ttrue,\n\t\t\t\toptions,\n\t\t\t\tCOLLECTION_START_TAG.length(),\n\t\t\t\tarrayList,\n\t\t\t\telementJavaType,","sourceCodeStart":306,"sourceCodeEnd":342,"githubUrl":"https://github.com/hibernate/hibernate-orm/blob/fad1729dce015f908198d57a8d80274a30f905a5/hibernate-core/src/main/java/org/hibernate/type/descriptor/jdbc/XmlHelper.java#L306-L342","documentation":"XmlHelper.arrayFromString handles the read path for XML array attributes. It requires the column value to be <Collection> ... </Collection>, or <Collection/> for an empty array. Any other content throws IllegalArgumentException 'Illegal XML for array'.","triggerScenarios":"Reading an attribute mapped with XmlArrayJdbcType (e.g. @Array / basic-array mapping on an XML column) whose stored value is not wrapped in the <Collection> tags: bare values, a different root element, or a plain empty string instead of <Collection/>.","commonSituations":"Array data written by an external tool or earlier Hibernate version; switching a column between scalar and array aggregate mappings; empty-string defaults on NOT NULL columns.","solutions":["Rewrite stored array values into <Collection>...</Collection> form (empty array exactly '<Collection/>').","Write array values through Hibernate so the wrapper is always emitted.","Check the attribute actually maps to XmlArrayJdbcType and the element type matches the stored elements."],"exampleFix":null,"handlingStrategy":"validation","validationCode":"static boolean isHibernateAggregateArrayXml(String s) {\n    return s == null || \"<Collection/>\".equals(s)\n        || (s.startsWith(\"<Collection>\") && s.endsWith(\"</Collection>\"));\n}","typeGuard":null,"tryCatchPattern":"try {\n    return session.find(Person.class, id);\n} catch (IllegalArgumentException ex) {\n    if (ex.getMessage() != null && ex.getMessage().startsWith(\"Illegal XML for array\")) {\n        quarantine(id, ex.getMessage());\n        return null;\n    }\n    throw ex;\n}","preventionTips":["Map XML array attributes only to columns written by Hibernate itself.","Store empty arrays as '<Collection/>' and NULLs as NULL in migration scripts.","Add a column-format check to deployment smoke tests."],"tags":["hibernate","xml","xml-array","collection-mapping","data-format"],"backgroundTag":"malformed-xml-data","analyzedSha":"fad1729dce015f908198d57a8d80274a30f905a5","analyzedAt":"2026-08-22T04:13:57.527Z","schemaVersion":2},"datasetVersion":"2026-08-22T09:17:25.309Z"}