{"record":{"id":"dde2698a269678d1","repo":"spring-projects/spring-security","slug":"unable-to-resolve-builder-for-elementname","errorCode":null,"errorMessage":"Unable to resolve Builder for \" + elementName","messagePattern":"Unable to resolve Builder for \" \\+ elementName","errorType":"exception","errorClass":"Saml2Exception","httpStatus":null,"severity":"error","filePath":"saml2/saml2-service-provider/src/opensaml5Main/java/org/springframework/security/saml2/provider/service/authentication/OpenSaml5Template.java","lineNumber":132,"sourceCode":"import org.springframework.security.saml2.core.Saml2ParameterNames;\nimport org.springframework.security.saml2.core.Saml2X509Credential;\nimport org.springframework.util.Assert;\nimport org.springframework.web.util.UriComponentsBuilder;\nimport org.springframework.web.util.UriUtils;\n\n/**\n * For internal use only. Subject to breaking changes at any time.\n */\n@NullMarked\nfinal class OpenSaml5Template implements OpenSamlOperations {\n\n\tprivate static final Log logger = LogFactory.getLog(OpenSaml5Template.class);\n\n\t@Override\n\tpublic <T extends XMLObject> T build(QName elementName) {\n\t\tXMLObjectBuilder<?> builder = XMLObjectProviderRegistrySupport.getBuilderFactory().getBuilder(elementName);\n\t\tif (builder == null) {\n\t\t\tthrow new Saml2Exception(\"Unable to resolve Builder for \" + elementName);\n\t\t}\n\t\treturn (T) builder.buildObject(elementName);\n\t}\n\n\t@Override\n\tpublic <T extends XMLObject> T deserialize(String serialized) {\n\t\treturn deserialize(new ByteArrayInputStream(serialized.getBytes(StandardCharsets.UTF_8)));\n\t}\n\n\t@Override\n\tpublic <T extends XMLObject> T deserialize(InputStream serialized) {\n\t\ttry {\n\t\t\tParserPool pool = XMLObjectProviderRegistrySupport.getParserPool();\n\t\t\tAssert.notNull(pool, \"ParserPool must be configured\");\n\t\t\tDocument document = pool.parse(serialized);\n\t\t\tElement element = document.getDocumentElement();\n\t\t\tUnmarshallerFactory factory = XMLObjectProviderRegistrySupport.getUnmarshallerFactory();\n\t\t\tUnmarshaller unmarshaller = factory.getUnmarshaller(element);","sourceCodeStart":114,"sourceCodeEnd":150,"githubUrl":"https://github.com/spring-projects/spring-security/blob/96852e8860138a482cb13d1479573f24ff6443c6/saml2/saml2-service-provider/src/opensaml5Main/java/org/springframework/security/saml2/provider/service/authentication/OpenSaml5Template.java#L114-L150","documentation":"OpenSaml5Template.build(QName) asks the OpenSAML XMLObjectBuilderFactory for a builder registered for the given element QName. If OpenSAML has no builder for that element name (unknown element, wrong namespace, or uninitialized registries), it throws Saml2Exception('Unable to resolve Builder for <elementName>').","triggerScenarios":"Calling template.build(qName) with a QName not registered in OpenSAML's builder factory — custom extension elements, typo'd namespace URIs, or building SAML elements before OpenSAML bootstrap has registered defaults.","commonSituations":"Constructing LogoutRequest/AttributeQuery or vendor-extension elements with a hand-built QName whose namespace URI or prefix spelling is wrong; forgetting OpenSamlInitializationService.initialize() in a custom setup; mixing OpenSAML 4-era element constants with OpenSAML 5 namespaces.","solutions":["Use the constants from net.shibboleth.opensaml or org.opensaml.saml (e.g. LogoutRequest.DEFAULT_ELEMENT_NAME) instead of hand-built QNames so namespace and element name match exactly.","Call OpenSamlInitializationService.initialize() at startup so default builders are registered.","For custom extension elements, register an XMLObjectBuilder for their QName via XMLObjectProviderRegistrySupport / an ObjectProvider.","Print the failing QName and compare its namespaceURI/localPart against OpenSAML's registered element names."],"exampleFix":"// before\nQName qname = new QName(\"logout\", \"LogoutRequest\");\nLogoutRequest req = template.build(qname);\n// after\nLogoutRequest req = template.build(LogoutRequest.DEFAULT_ELEMENT_NAME);","handlingStrategy":"validation","validationCode":"XMLObjectBuilder<?> b = XMLObjectProviderRegistrySupport.getBuilderFactory().getBuilder(elementName);\nif (b == null) {\n    throw new IllegalArgumentException(\"No OpenSAML builder registered for \" + elementName);\n}","typeGuard":null,"tryCatchPattern":"try {\n    T obj = template.build(elementName);\n} catch (Saml2Exception ex) {\n    throw new IllegalStateException(\"OpenSAML builder missing — check initialization and QName\", ex);\n}","preventionTips":["Use DEFAULT_ELEMENT_NAME constants instead of hand-built QNames.","Call OpenSamlInitializationService.initialize() in a @PostConstruct or startup bean.","Register builders for custom extension elements up front.","Unit-test element construction in a context that mimics production bootstrap."],"tags":["saml2","opensaml","xml-object-builder"],"backgroundTag":"unsupported-operation","analyzedSha":"96852e8860138a482cb13d1479573f24ff6443c6","analyzedAt":"2026-09-10T23:25:23.477Z","contentChangedAt":"2026-09-10T23:25:23.477Z","schemaVersion":2},"datasetVersion":"2026-09-14T16:17:12.679Z"}