{"record":{"id":"8e3ac417425b3f22","repo":"spring-projects/spring-security","slug":"unable-to-resolve-builder-for","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/metadata/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/metadata/OpenSaml5Template.java#L114-L150","documentation":"This is the metadata-package copy of OpenSaml5Template.build(): it looks up an XMLObjectBuilder for the given QName in OpenSAML's registry and throws Saml2Exception when none is registered, meaning OpenSAML cannot construct the requested element type because providers were not initialized or the element is unknown to the registry.","triggerScenarios":"Calling OpenSaml5Template.build(QName) for a metadata (or other) element with no registered builder — OpenSAML bootstrap not run, wrong QName namespace/local part, or an extension element (e.g. entity attributes) from a module that is not on the classpath.","commonSituations":"Generating SAML metadata before OpenSamlInitializationService.initialize() registered default providers; building EntityDescriptor sub-elements from extension namespaces without the corresponding OpenSAML dependency; hand-built QName literals with typo'd namespace URIs.","solutions":["Initialize OpenSAML default providers before building (OpenSamlInitializationService.initialize() or Spring Security's bootstrap).","Use the element's DEFAULT_ELEMENT_NAME constant instead of a hand-built QName.","Add the OpenSAML module providing the element (opensaml-saml-api/impl, opensaml-saml-ext, etc.).","For custom elements, register a builder via XMLObjectProviderRegistry.registerObjectProvider(...)."],"exampleFix":"// before\ntemplate.build(new QName(\"urn:oasis:names:tc:SAML:2.0:metadata\", \"EntityDescriptor\")); // wrong ns -> no builder\n// after\ntemplate.build(EntityDescriptor.DEFAULT_ELEMENT_NAME);","handlingStrategy":"try-catch","validationCode":"OpenSamlInitializationService.initialize();\nif (XMLObjectProviderRegistrySupport.getBuilderFactory().getBuilder(elementName) == null) {\n    throw new IllegalStateException(\"No OpenSAML builder registered for \" + elementName);\n}","typeGuard":"static boolean hasBuilder(QName elementName) {\n    return XMLObjectProviderRegistrySupport.getBuilderFactory().getBuilder(elementName) != null;\n}","tryCatchPattern":"try {\n    T obj = template.build(elementName);\n} catch (Saml2Exception ex) {\n    throw new IllegalStateException(\"OpenSAML builder missing for \" + elementName\n            + \"; initialize providers and check module dependencies\", ex);\n}","preventionTips":["Run OpenSamlInitializationService.initialize() at startup in every app using OpenSAML.","Use DEFAULT_ELEMENT_NAME constants for metadata elements (EntityDescriptor, EntitiesDescriptor).","Add opensaml modules for any metadata extensions you consume.","Health-check builder availability for all elements you build."],"tags":["saml2","opensaml","metadata","builder-not-found"],"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"}