Page[pages/index/index] not found. May be caused by: 1. Forgot to add page route in app.json

博主入坑小程序时遇到错误,网上方法无法解决,最终发现是在app.js中加入了Page({})生命周期函数,去掉该函数后错误消除。还提到可能有其他情况会导致此错误,希望与大家相互学习。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

最近入坑小程序,出现了如图下所示的错误,发现很多人都有这种情况,在网上搜出来的方法不能解决我的问题,最后无意中自己搞掉了这个错误。
在这里插入图片描述
问题所在,原来我在app.js中加入了Page({})生命周期函数,去掉就好了。
在这里插入图片描述
这是我遇到的一种情况,可能还有很多情况会出现这样的错误,第一次写博客,相互学习。
Please do not call Page constructor in files that not listed in “pages” section of app.json or plugin.json
VM1204:1 thirdScriptError
sdk uncaught third Error
APP-SERVICE-Engine:Please do not call Page constructor in files that not listed in “pages” section of app.json or plugin.json
Error: APP-SERVICE-Engine:Please do not call Page constructor in files that not listed in “pages” section of app.json or plugin.json
at mt (http://127.0.0.1:22972/appservice/dev/WAService.js:1:950928)
at Nt (http://127.0.0.1:22972/appservice/dev/WAService.js:1:964856)
at http://127.0.0.1:22972/appservice/app.js:3:1
at require (http://127.0.0.1:22972/appservice/dev/WAService.js:1:971778)
at :1:1
at HTMLScriptElement.scriptLoaded (http://127.0.0.1:22972/appservice/appservice?t=1553221841796:1697:21)
at HTMLScriptElement.script.onload (http://127.0.0.1:22972/appservice/appservice?t=1553221841796:1709:20)

<think>我们正在解决一个DateTimeParseException异常,该异常发生在MyBatis尝试设置PolicyDetail类的underwriteDate属性时,原因是无法解析空字符串('')为日期。根据错误堆栈:Causedby:java.time.format.DateTimeParseException:Text''couldnotbeparsedatindex0这意味着MyBatis从数据库获取了一个空字符串('')并尝试将其解析为日期类型(如LocalDate或LocalDateTime),但空字符串无法被解析。解决方案的核心:1.避免将空字符串传递给日期字段:在数据库查询中,确保如果日期为空,则返回null而不是空字符串。2.在Java实体类中,日期字段应该使用包装类型(如LocalDateTime)而不是基本类型(如long)以便能够接受null值。3.在类型处理器中处理空字符串的情况,将其转换为null。具体步骤:步骤1:检查数据库字段类型和值确保数据库中的underwrite_date字段在为空时返回的是NULL,而不是空字符串。如果是空字符串,我们需要在SQL查询中将其转换为NULL。例如,在查询中可以使用CASE语句:SELECT...,CASEWHENunderwrite_date=''THENNULLELSEunderwrite_dateENDASunderwrite_dateFROM...步骤2:使用自定义类型处理器(TypeHandler)我们可以为日期类型(如LocalDateTime)编写一个自定义的类型处理器,当遇到空字符串时,返回null。自定义类型处理器示例:```javaimportorg.apache.ibatis.type.BaseTypeHandler;importorg.apache.ibatis.type.JdbcType;importorg.apache.ibatis.type.MappedTypes;importjava.sql.*;importjava.time.LocalDateTime;importjava.time.format.DateTimeFormatter;@MappedTypes(LocalDateTime.class)publicclassLocalDateTimeTypeHandlerextendsBaseTypeHandler<LocalDateTime>{privatefinalDateTimeFormatterformatter=DateTimeFormatter.ofPattern("yyyy-MM-ddHH:mm:ss");@OverridepublicvoidsetNonNullParameter(PreparedStatementps,inti,LocalDateTimeparameter,JdbcTypejdbcType)throwsSQLException{ps.setTimestamp(i,Timestamp.valueOf(parameter));}@OverridepublicLocalDateTimegetNullableResult(ResultSetrs,StringcolumnName)throwsSQLException{Stringvalue=rs.getString(columnName);if(value==null||value.isEmpty()){returnnull;}returnLocalDateTime.parse(value,formatter);}@OverridepublicLocalDateTimegetNullableResult(ResultSetrs,intcolumnIndex)throwsSQLException{Stringvalue=rs.getString(columnIndex);if(value==null||value.isEmpty()){returnnull;}returnLocalDateTime.parse(value,formatter);}@OverridepublicLocalDateTimegetNullableResult(CallableStatementcs,intcolumnIndex)throwsSQLException{Stringvalue=cs.getString(columnIndex);if(value==null||value.isEmpty()){returnnull;}returnLocalDateTime.parse(value,formatter);}}```然后,在MyBatis配置文件中注册这个类型处理器:```xml<typeHandlers><typeHandlerhandler="com.yourpackage.LocalDateTimeTypeHandler"/></typeHandlers>```步骤3:在实体类中,确保underwriteDate字段的类型为LocalDateTime(或其他Java8日期类型)且为包装类型(即不是基本类型,如long)。步骤4:检查SQL查询,确保没有返回空字符串给日期字段。如果数据库存储的是空字符串,最好在数据库层面修复,将其改为NULL。步骤5:如果不想使用自定义类型处理器,可以在SQL查询中使用数据库函数将空字符串转换为NULL,例如(MySQL):SELECT...,NULLIF(underwrite_date,'')ASunderwrite_dateFROM...步骤6:在实体类中,也可以考虑使用注解来指定日期格式,但这里主要问题不是格式,而是空字符串。所以上述步骤更关键。总结:根本原因是空字符串无法被解析为日期。我们需要确保从数据库获取到的是NULL或者有效的日期字符串。通过自定义类型处理器处理空字符串是一种稳健的方法。相关问题:1.如何解决MyBatis中日期类型转换的常见问题?2.在MyBatis中如何处理数据库中的空值(NULL或空字符串)?3.如何为MyBatis编写自定义类型处理器(TypeHandler)?4.在Java实体类中,日期字段应该使用什么类型?5.如何优化数据库查询以避免返回无效的日期字符串?注意:以上代码示例中,我们假设数据库返回的日期字符串格式是"yyyy-MM-ddHH:mm:ss",如果不是,请调整格式。</think>### 解决 MyBatis 中 `DateTimeParseException` 异常(underwriteDate 属性解析问题) #### 问题根源分析 1. **空字符串解析失败** 错误信息 `Text '' could not be parsed at index 0` 表明 MyBatis 尝试将空字符串 `''` 解析为日期类型,而 Java 的日期 API 无法处理空值[^1]。 2. **类型不匹配** 数据库返回的 `underwrite_date` 字段值可能是: - 实际为空值(NULL) - 空字符串 `''` - 格式不匹配的日期字符串 3. **映射机制缺陷** MyBatis 默认类型处理器无法正确处理空值到 Java 8 日期类型的转换。 --- ### 解决方案(逐步实施) #### 方案一:修复数据库查询(推荐) 在 SQL 层将空值转换为安全格式: ```sql SELECT policy_id, -- 关键修复:将空值转为 NULL NULLIF(underwrite_date, '') AS underwrite_date FROM policy_table ``` > **作用**:确保数据库返回 `NULL` 而非空字符串,避免解析失败[^4]。 #### 方案二:自定义类型处理器 创建处理空值的类型处理器: ```java public class SafeLocalDateTimeTypeHandler extends BaseTypeHandler<LocalDateTime> { @Override public void setNonNullParameter(PreparedStatement ps, int i, LocalDateTime parameter, JdbcType jdbcType) { ps.setObject(i, parameter); } @Override public LocalDateTime getNullableResult(ResultSet rs, String columnName) throws SQLException { // 核心逻辑:空值返回 null String value = rs.getString(columnName); return StringUtils.isEmpty(value) ? null : LocalDateTime.parse(value); } } ``` 在 MyBatis 配置中注册: ```xml <typeHandlers> <typeHandler handler="com.yourpackage.SafeLocalDateTimeTypeHandler" javaType="java.time.LocalDateTime"/> </typeHandlers> ``` #### 方案三:实体类防御处理 在 `PolicyDetail` 类中添加空值校验: ```java public class PolicyDetail { private LocalDateTime underwriteDate; public void setUnderwriteDate(String value) { // 过滤空值 if (value == null || value.trim().isEmpty()) { this.underwriteDate = null; } else { this.underwriteDate = LocalDateTime.parse(value); } } } ``` #### 方案四:全局空值处理 在 `application.yml` 中配置: ```yaml mybatis: configuration: call-setters-on-nulls: false # 禁止为 null 字段调用 setter ``` --- ### 验证步骤 1. **检查数据库实际值** 执行查询确认返回值: ```sql SELECT underwrite_date FROM policy_table WHERE id = {your_id} ``` 2. **启用 MyBatis SQL 日志** 在配置中添加: ```xml <settings> <setting name="logImpl" value="STDOUT_LOGGING"/> </settings> ``` 3. **测试用例验证** ```java // 模拟空值场景测试 PolicyDetail detail = new PolicyDetail(); detail.setUnderwriteDate(""); // 应不抛异常 assertNull(detail.getUnderwriteDate()); ``` --- ### 预防措施 1. **数据库设计约束** ```sql ALTER TABLE policy_table MODIFY underwrite_date DATETIME DEFAULT NULL; -- 禁止空字符串 ``` 2. **统一日期格式** 在实体类中声明格式: ```java public class PolicyDetail { @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") private LocalDateTime underwriteDate; } ``` 3. **MyBatis 严格映射** 禁用自动映射: ```xml <resultMap id="policyMap" type="PolicyDetail" autoMapping="false"> <result property="underwriteDate" column="underwrite_date" typeHandler="org.apache.ibatis.type.LocalDateTimeTypeHandler"/> </resultMap> ``` > 通过组合方案一(SQL层修复)和方案二(自定义处理器),可彻底解决此问题[^1][^4]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值