{"record":{"id":"f290fd1c1944e9ae","repo":"spring-projects/spring-security","slug":"unable-to-resolve-builder-for-f290fd","errorCode":null,"errorMessage":"Unable to resolve Builder for ","messagePattern":"Unable to resolve Builder for ","errorType":"exception","errorClass":"Saml2Exception","httpStatus":null,"severity":"error","filePath":"saml2/saml2-service-provider/src/opensaml5Main/java/org/springframework/security/saml2/provider/service/web/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/web/OpenSaml5Template.java#L114-L150","documentation":"OpenSaml5Template.build(QName) looks up an XMLObjectBuilder from the OpenSAML global builder registry for the requested element name. If no builder is registered for that QName, it throws Saml2Exception('Unable to resolve Builder for ...'). This means OpenSAML's ObjectProvider registry lacks a builder for the requested SAML element.","triggerScenarios":"Calling OpenSamlTemplate.build(elementName) with a QName for which XMLObjectProviderRegistrySupport.getBuilderFactory().getBuilder(qname) returns null — e.g. a custom or non-standard element, or OpenSAML's default providers were never initialized (initialize()/XMLObjectProviderRegistry not bootstrapped).","commonSituations":"Using a misspelled or namespaced QName; requesting vendor extension elements without registering custom builders; calling build() very early before OpenSaml5's static initialization registered defaults.","solutions":["Use a QName that matches a standard SAML element (correct namespace URI, e.g. SAML 2.0 assertion namespace)","Ensure OpenSAML initialization ran (Spring's OpenSamlInitializationService / OpenSaml4/5 library defaults)","Register a custom builder via XMLObjectProviderRegistrySupport.registerObjectProvider for extension elements","Log the element QName and compare against registered providers"],"exampleFix":"// before\nQName qname = new QName(\"urn:wrong:ns\", \"Response\");\ntemplate.build(qname); // no builder for this QName\n// after\nQName qname = new QName(SAMLConstants.SAML20_NS, \"Response\", SAMLConstants.SAML20_PREFIX);\ntemplate.build(qname);","handlingStrategy":"validation","validationCode":"XMLObjectBuilder<?> builder = XMLObjectProviderRegistrySupport.getBuilderFactory().getBuilder(elementName);\nif (builder == null) {\n    throw new IllegalArgumentException(\"No OpenSAML builder registered for \" + elementName);\n}","typeGuard":null,"tryCatchPattern":"try {\n    XMLObject obj = template.build(elementName);\n} catch (Saml2Exception ex) {\n    throw new IllegalStateException(\"Builder missing for \" + elementName + \" — register an ObjectProvider or check the QName\", ex);\n}","preventionTips":["Use QNames from OpenSAML constants (SAMLConstants, SAML2 namespace constants) rather than hand-built ones","Ensure OpenSamlInitializationService.initialize() has run before building objects","Register custom ObjectProviders for extension elements before use"],"tags":["saml2","opensaml","builder","xmlobject","spring-security"],"backgroundTag":"resource-not-found","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"}