{"record":{"id":"027fdf73dd2c7977","repo":"mybatis/mybatis-3","slug":"environment-declaration-requires-a-datasourcefacto","errorCode":null,"errorMessage":"Environment declaration requires a DataSourceFactory.","messagePattern":"Environment declaration requires a DataSourceFactory\\.","errorType":"validation","errorClass":"BuilderException","httpStatus":null,"severity":"error","filePath":"src/main/java/org/apache/ibatis/builder/xml/XMLConfigBuilder.java","lineNumber":357,"sourceCode":"    if (context != null) {\n      String type = context.getStringAttribute(\"type\");\n      Properties props = context.getChildrenAsProperties();\n      TransactionFactory factory = (TransactionFactory) resolveClass(type).getDeclaredConstructor().newInstance();\n      factory.setProperties(props);\n      return factory;\n    }\n    throw new BuilderException(\"Environment declaration requires a TransactionFactory.\");\n  }\n\n  private DataSourceFactory dataSourceElement(XNode context) throws Exception {\n    if (context != null) {\n      String type = context.getStringAttribute(\"type\");\n      Properties props = context.getChildrenAsProperties();\n      DataSourceFactory factory = (DataSourceFactory) resolveClass(type).getDeclaredConstructor().newInstance();\n      factory.setProperties(props);\n      return factory;\n    }\n    throw new BuilderException(\"Environment declaration requires a DataSourceFactory.\");\n  }\n\n  private void typeHandlersElement(XNode context) {\n    if (context == null) {\n      return;\n    }\n    for (XNode child : context.getChildren()) {\n      if (\"package\".equals(child.getName())) {\n        String typeHandlerPackage = child.getStringAttribute(\"name\");\n        typeHandlerRegistry.register(typeHandlerPackage);\n      } else {\n        String javaTypeName = child.getStringAttribute(\"javaType\");\n        String jdbcTypeName = child.getStringAttribute(\"jdbcType\");\n        String handlerTypeName = child.getStringAttribute(\"handler\");\n        Class<?> javaTypeClass = resolveClass(javaTypeName);\n        JdbcType jdbcType = resolveJdbcType(jdbcTypeName);\n        Class<?> typeHandlerClass = resolveClass(handlerTypeName);\n        if (javaTypeClass != null) {","sourceCodeStart":339,"sourceCodeEnd":375,"githubUrl":"https://github.com/mybatis/mybatis-3/blob/008069adb1b089579b5dcba87ee591908b263274/src/main/java/org/apache/ibatis/builder/xml/XMLConfigBuilder.java#L339-L375","documentation":"Error \"Environment declaration requires a DataSourceFactory.\" thrown in mybatis/mybatis-3.","triggerScenarios":"Thrown at src/main/java/org/apache/ibatis/builder/xml/XMLConfigBuilder.java:357 when the library encounters an invalid state.","commonSituations":"See trigger scenarios.","solutions":["Add a <dataSource> element with a type such as POOLED, UNPOOLED, or JNDI inside the <environment> declaration.","Example: <dataSource type=\"POOLED\"> with the required driver/url/username/password properties."],"exampleFix":null,"handlingStrategy":null,"validationCode":null,"typeGuard":null,"tryCatchPattern":null,"preventionTips":[],"tags":[],"backgroundTag":null,"analyzedSha":"008069adb1b089579b5dcba87ee591908b263274","analyzedAt":"2026-08-14T13:07:10.264Z","schemaVersion":2},"datasetVersion":"2026-08-15T22:17:37.221Z"}