{"record":{"id":"6c2326ec6eb2416a","repo":"apache/maven","slug":"reader-or-inputstream-must-be-non-null","errorCode":null,"errorMessage":"reader or inputStream must be non null","messagePattern":"reader or inputStream must be non null","errorType":"validation","errorClass":"IllegalArgumentException","httpStatus":null,"severity":"error","filePath":"impl/maven-impl/src/main/java/org/apache/maven/impl/DefaultSettingsXmlFactory.java","lineNumber":53,"sourceCode":"import org.apache.maven.api.settings.InputLocation;\nimport org.apache.maven.api.settings.InputSource;\nimport org.apache.maven.api.settings.Settings;\nimport org.apache.maven.settings.v4.SettingsStaxReader;\nimport org.apache.maven.settings.v4.SettingsStaxWriter;\n\nimport static org.apache.maven.impl.StaxLocation.getLocation;\nimport static org.apache.maven.impl.StaxLocation.getMessage;\n\n@Named\n@Singleton\npublic class DefaultSettingsXmlFactory implements SettingsXmlFactory {\n    @Override\n    public Settings read(@Nonnull XmlReaderRequest request) throws XmlReaderException {\n        nonNull(request, \"request\");\n        Reader reader = request.getReader();\n        InputStream inputStream = request.getInputStream();\n        if (reader == null && inputStream == null) {\n            throw new IllegalArgumentException(\"reader or inputStream must be non null\");\n        }\n        try {\n            InputSource source = null;\n            if (request.getModelId() != null || request.getLocation() != null) {\n                source = InputSource.of(request.getLocation());\n            }\n            SettingsStaxReader xml = request.getTransformer() != null\n                    ? new SettingsStaxReader(request.getTransformer()::transform)\n                    : new SettingsStaxReader();\n            xml.setAddDefaultEntities(request.isAddDefaultEntities());\n            if (reader != null) {\n                return xml.read(reader, request.isStrict(), source);\n            } else {\n                return xml.read(inputStream, request.isStrict(), source);\n            }\n        } catch (Exception e) {\n            throw new XmlReaderException(\"Unable to read settings: \" + getMessage(e), getLocation(e), e);\n        }","sourceCodeStart":35,"sourceCodeEnd":71,"githubUrl":"https://github.com/apache/maven/blob/e4093d4e120eac99d6bdce5ba67cace2f3085c97/impl/maven-impl/src/main/java/org/apache/maven/impl/DefaultSettingsXmlFactory.java#L35-L71","documentation":"DefaultSettingsXmlFactory.read accepts only a Reader or an InputStream - unlike the model and plugin factories it does not consult path or url on the request. If both reader and inputStream are null it throws IllegalArgumentException before parsing.","triggerScenarios":"Building a XmlReaderRequest for settings with only .path(...) or .url(...) set; those fields are ignored by this factory, so the call is rejected. Also a request with no source at all.","commonSituations":"Reusing request-builder code from DefaultModelXmlFactory or DefaultPluginXmlFactory, which do support path/url; developers assuming a symmetric API across all Maven XML factories.","solutions":["Open the source yourself and pass .inputStream(Files.newInputStream(path)) or .reader(Files.newBufferedReader(path))","For URLs, use .inputStream(url.openStream()) and close it afterwards","Check getReader()/getInputStream() for null before calling read"],"exampleFix":"// before\nSettings s = settingsXmlFactory.read(XmlReaderRequest.builder()\n    .path(settingsPath) // ignored: this factory wants reader or inputStream\n    .build()); // throws\n\n// after\ntry (InputStream is = Files.newInputStream(settingsPath)) {\n    Settings s = settingsXmlFactory.read(XmlReaderRequest.builder()\n        .inputStream(is)\n        .build());\n}","handlingStrategy":"validation","validationCode":"XmlReaderRequest req = XmlReaderRequest.builder().build();\nif (req.getReader() == null && req.getInputStream() == null) {\n    try (InputStream is = Files.newInputStream(settingsPath)) {\n        settingsXmlFactory.read(XmlReaderRequest.builder()\n            .inputStream(is)\n            .build());\n    }\n} else {\n    settingsXmlFactory.read(req);\n}","typeGuard":null,"tryCatchPattern":null,"preventionTips":["Remember this factory ignores path and url: always open the stream yourself","Keep one helper that builds settings read requests so the open-stream step is never skipped"],"tags":["maven","settings","xml","reader","null-check"],"backgroundTag":"missing-required-argument","analyzedSha":"e4093d4e120eac99d6bdce5ba67cace2f3085c97","analyzedAt":"2026-08-21T22:58:24.034Z","schemaVersion":2},"datasetVersion":"2026-08-21T23:17:16.201Z"}