{"record":{"id":"7e154b820f574932","repo":"apache/maven","slug":"request-workspacemodelresolver-and-request-modelre","errorCode":null,"errorMessage":"request.workspaceModelResolver and request.modelResolver cannot be null (parent POM %s and POM %s)","messagePattern":"request\\.workspaceModelResolver and request\\.modelResolver cannot be null \\(parent POM (.+?) and POM (.+?)\\)","errorType":"exception","errorClass":"NullPointerException","httpStatus":null,"severity":"error","filePath":"compat/maven-model-builder/src/main/java/org/apache/maven/model/building/DefaultModelBuilder.java","lineNumber":1188,"sourceCode":"                StringBuilder message =\n                        new StringBuilder(\"The dependencies of type=pom and with scope=import form a cycle: \");\n                for (String modelId : importIds) {\n                    message.append(modelId);\n                    message.append(\" -> \");\n                }\n                message.append(imported);\n                problems.add(\n                        new ModelProblemCollectorRequest(Severity.ERROR, Version.BASE).setMessage(message.toString()));\n\n                continue;\n            }\n\n            DependencyManagement importMgmt =\n                    getCache(request.getModelCache(), groupId, artifactId, version, ModelCacheTag.IMPORT);\n\n            if (importMgmt == null) {\n                if (workspaceResolver == null && modelResolver == null) {\n                    throw new NullPointerException(String.format(\n                            \"request.workspaceModelResolver and request.modelResolver cannot be null\"\n                                    + \" (parent POM %s and POM %s)\",\n                            ModelProblemUtils.toId(groupId, artifactId, version),\n                            ModelProblemUtils.toSourceHint(model)));\n                }\n\n                Model importModel = null;\n                if (workspaceResolver != null) {\n                    try {\n                        importModel = workspaceResolver.resolveEffectiveModel(groupId, artifactId, version);\n                    } catch (UnresolvableModelException e) {\n                        problems.add(new ModelProblemCollectorRequest(Severity.FATAL, Version.BASE)\n                                .setMessage(e.getMessage())\n                                .setException(e));\n                        continue;\n                    }\n                }\n","sourceCodeStart":1170,"sourceCodeEnd":1206,"githubUrl":"https://github.com/apache/maven/blob/e4093d4e120eac99d6bdce5ba67cace2f3085c97/compat/maven-model-builder/src/main/java/org/apache/maven/model/building/DefaultModelBuilder.java#L1170-L1206","documentation":"While importing a BOM (a <dependencyManagement> dependency with <scope>import</scope> and <type>pom</type>), DefaultModelBuilder must resolve the imported POM either from the workspace (workspaceModelResolver) or from repositories (modelResolver). If the ModelBuildingRequest carries neither, resolution is impossible and it throws NullPointerException naming both resolvers plus the importing and imported POM coordinates.","triggerScenarios":"Building a POM that imports a BOM with a ModelBuildingRequest whose modelResolver and workspaceModelResolver are both null, standard in unit tests that build models without repository infrastructure.","commonSituations":"Unit tests using DefaultModelBuilder directly on poms with BOM imports; embedded Maven usage that forgot to install a ModelResolver; tooling that only reads raw models but consumes poms importing BOMs.","solutions":["Provide a ModelResolver on the request: request.setModelResolver(...) (stub in tests, repository-backed DefaultModelResolver in production)","In tests, stub ModelResolver to return the BOM's ModelSource for its GAV (e.g. Mockito + FileModelSource)","For reactor builds, supply a WorkspaceModelResolver so sibling BOMs resolve without repositories","Only leave both resolvers null when you are certain no built pom imports a BOM"],"exampleFix":"// before: pom imports a BOM but the request has no resolvers -> NPE\n//   <dependencyManagement><dependencies><dependency>\n//     <groupId>com.example</groupId><artifactId>bom</artifactId>\n//     <version>1.0</version><scope>import</scope><type>pom</type>\n//   </dependency></dependencies></dependencyManagement>\nrequest.setPomFile(pom);\n\n// after: supply a ModelResolver (stub in tests)\nModelResolver resolver = mock(ModelResolver.class);\nwhen(resolver.resolveModel(\"com.example\", \"bom\", \"1.0\"))\n    .thenReturn(new FileModelSource(new File(\"repos/com/example/bom/1.0/bom-1.0.pom\")));\nrequest.setModelResolver(resolver);","handlingStrategy":"validation","validationCode":"// Any pom that imports a BOM needs at least one resolver\nif (request.getModelResolver() == null && request.getWorkspaceModelResolver() == null) {\n    ModelResolver resolver = mock(ModelResolver.class);\n    when(resolver.resolveModel(\"com.example\", \"bom\", \"1.0\"))\n        .thenReturn(new FileModelSource(bomPom));\n    request.setModelResolver(resolver); // or wire a real resolver\n}","typeGuard":null,"tryCatchPattern":null,"preventionTips":["In tests, always install a stub ModelResolver serving parent and BOM poms from src/test/resources","For embedded use, wire a WorkspaceModelResolver for reactor siblings plus a repository-backed ModelResolver","Add a smoke test that builds a pom containing a <scope>import</scope> BOM"],"tags":["maven","model-building","bom","dependency-management","missing-resolver"],"backgroundTag":"missing-model-resolver","analyzedSha":"e4093d4e120eac99d6bdce5ba67cace2f3085c97","analyzedAt":"2026-08-21T22:58:24.034Z","schemaVersion":2},"datasetVersion":"2026-08-21T23:17:16.201Z"}