Spring jPetStore err:org.apache.jasper.JasperException: /WEB-INF/jsp/struts/IncludeTop.jsp(23,0) According to TLD or attribute d

本文介绍了解决SpingDemoJpetStore项目中由于JSTL版本不一致导致的JSP错误的方法。通过调整WEB-INF下的TLD文件路径及在web.xml中重新定义taglib的URI,使得JSP页面能够正常运行。

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

Sping Demo JpetStore 当web.xml配置和struts整合时,运行jsp页面会出现如下错误:

org.apache.jasper.JasperException: /WEB-INF/jsp/struts/IncludeTop.jsp(23,0) According to TLD or attribute directive in tag file, attribute test does not accept any expressions.

原因是jstl 的包tld文建已经打好到standard包中,这个standard.jar是1.0版本的核心库tld描述,而jsp页面使用的都是jstl1.1的语法,所以必须把1.1的tld拷贝到WEB-INF/下,并在web.xmll中重新定义taglib,为了尽量不修改jsp文件对jstl的引用,按照jsp引用taglib的uri来修改web.xml中jstl的taglib的uri。如下:

<jsp-config>
  <taglib>
      <taglib-uri>/WEB-INF/struts-bean.tld</taglib-uri>
      <taglib-location>/WEB-INF/struts-bean.tld</taglib-location>
    </taglib>
    <taglib>
      <taglib-uri>/WEB-INF/struts-html.tld</taglib-uri>
      <taglib-location>/WEB-INF/struts-html.tld</taglib-location>
    </taglib>
    <taglib>
      <taglib-uri>/WEB-INF/struts-logic.tld</taglib-uri>
      <taglib-location>/WEB-INF/struts-logic.tld</taglib-location>
    </taglib>
    <taglib>
      <taglib-uri>/WEB-INF/struts-tiles.tld</taglib-uri>
      <taglib-location>/WEB-INF/struts-tiles.tld</taglib-location>
    </taglib>
    <taglib>
      <taglib-uri>/WEB-INF/struts-nested.tld</taglib-uri>
      <taglib-location>/WEB-INF/struts-nested.tld</taglib-location>
    </taglib>
     <taglib>
  <taglib-uri>http://java.sun.com/jstl/core</taglib-uri>
  <taglib-location>/WEB-INF/c.tld</taglib-location>
 </taglib>
 <taglib>
  <taglib-uri>http://java.sun.com/jstl/fmt</taglib-uri>
  <taglib-location>/WEB-INF/fmt.tld</taglib-location>
 </taglib>
 <taglib>
  <taglib-uri>http://java.sun.com/jstl/sql</taglib-uri>
  <taglib-location>/WEB-INF/sql.tld</taglib-location>
 </taglib>
 <taglib>
  <taglib-uri>http://java.sun.com/jstl/x</taglib-uri>
  <taglib-location>/WEB-INF/x.tld</taglib-location>
 </taglib>
    </jsp-config>

jsp页面使用

<%@ taglib prefix="c" uri="http://java.sun.com/jstl/core" %>
<%@ taglib prefix="fmt" uri="http://java.sun.com/jstl/fmt" %>

这样就不报错了。

这样就不报错了。

<think>好的,我现在需要解决用户提到的MyBatis中出现的“Invalid bound statement (not found): AccountMapper.query”问题。首先,我应该回忆一下MyBatis常见的导致这个错误的原因,然后一步步分析可能的情况,并给出对应的解决方案。 用户的问题很明确,是调用AccountMapper的query方法时找不到对应的绑定语句。根据经验,这个问题通常与Mapper接口和XML文件的配置有关。首先,我需要确认用户是否正确配置了XML文件的位置,并确保XML中的namespace和id是否正确。 接下来,可能的检查点包括: 1. **XML文件是否被正确扫描到**:MyBatis需要将Mapper XML文件放在指定的资源目录下,并且路径需要与Mapper接口的包名对应。例如,如果AccountMapper接口在com.example.mapper包中,那么XML文件应该在resources/com/example/mapper目录下,且文件名通常为AccountMapper.xml。 2. **XML中的namespace是否正确**:XML文件的namespace属性必须指向Mapper接口的全限定名,比如com.example.mapper.AccountMapper。如果这里写错了,MyBatis就无法将接口方法与XML中的语句绑定。 3. **方法名是否匹配**:在XML中,比如select语句的id属性必须与接口中的方法名一致,这里是query。如果大小写不一致或者拼写错误,也会导致找不到绑定语句。 4. **XML语法是否正确**:比如是否正确使用了<select>标签,是否指定了resultType或resultMap,以及SQL语句是否正确。语法错误可能导致整个XML文件无法被正确解析,从而使方法绑定失败。 5. **Maven/Gradle配置问题**:如果使用构建工具,需要检查资源文件的包含规则是否正确,确保XML文件在编译后被正确复制到类路径中。有时候,Maven可能会忽略src/main/resources下的某些文件,需要检查pom.xml中的资源配置。 6. **MyBatis配置文件中是否正确指定了Mapper的位置**:在mybatis-config.xml中,如果使用了<mappers>标签,需要确认是否正确映射了Mapper接口或XML文件的位置。 7. **检查是否编译后的target目录中存在XML文件**:有时候IDE可能没有自动将XML文件复制到输出目录,导致运行时找不到对应的文件。手动检查target/classes下的对应路径,确认XML文件是否存在。 8. **是否使用了注解而非XML**:如果Mapper接口的方法使用了注解如@Select,而没有对应的XML配置,但用户误用了XML,或者反过来,也可能导致问题。需要确认方法是通过XML还是注解实现的。 接下来,我需要将这些可能的原因整理成一个清晰的步骤,帮助用户逐一排查。同时,用户可能不太清楚如何检查这些配置,因此需要给出具体的示例和检查点,比如路径示例、XML配置示例等。 另外,用户提供的引用中提到了Activiti升级时索引的问题,但可能与当前问题关联不大。不过,可能需要提醒用户在检查配置时注意是否有可能的冲突,比如自定义的配置是否覆盖了MyBatis的默认设置,或者构建过程中是否有其他插件影响了资源文件的处理。 最后,生成相关问题时要围绕MyBatis的常见配置问题、性能优化、异常处理等方面展开,帮助用户进一步理解可能遇到的类似问题。</think>### 解决MyBatis中`AccountMapper.query`方法未找到的问题 当出现`Invalid bound statement (not found): AccountMapper.query`错误时,通常是因为MyBatis未正确绑定Mapper接口与对应的XML文件。以下是逐步排查和解决方案: --- #### **1. 检查XML文件路径和命名规范** - **原因**: MyBatis默认从`resources`目录下扫描XML文件,且文件路径需与Mapper接口的包名完全匹配。 - **解决**: - 确保XML文件位于`src/main/resources`下,且路径与Mapper接口包名一致。例如: - 接口路径:`com.example.mapper.AccountMapper` - XML路径:`resources/com/example/mapper/AccountMapper.xml` - 若使用Maven/Gradle,需检查`pom.xml`或`build.gradle`中是否包含XML文件的资源过滤配置[^1]: ```xml <!-- Maven配置示例 --> <resources> <resource> <directory>src/main/resources</directory> <includes> <include>**/*.xml</include> </includes> </resource> </resources> ``` --- #### **2. 验证XML中的`namespace`和方法`id`** - **原因**: XML文件中的`namespace`必须指向Mapper接口的全限定名,`id`需与方法名一致。 - **解决**: - 检查XML的`namespace`是否与接口名一致: ```xml <!-- AccountMapper.xml --> <mapper namespace="com.example.mapper.AccountMapper"> <select id="query" resultType="com.example.entity.Account"> SELECT * FROM account </select> </mapper> ``` - 确保`<select>`标签的`id`为`query`,且无拼写错误或大小写问题。 --- #### **3. 检查MyBatis配置文件中Mapper的加载方式** - **原因**: 若使用`mybatis-config.xml`,需显式指定Mapper文件位置。 - **解决**: - 在配置文件中添加Mapper扫描路径: ```xml <mappers> <mapper resource="com/example/mapper/AccountMapper.xml"/> </mappers> ``` - 或通过注解扫描(需在接口上添加`@Mapper`注解): ```java @Mapper public interface AccountMapper { List<Account> query(); } ``` --- #### **4. 确认构建工具是否复制了XML文件** - **原因**: Maven/Gradle可能未将XML文件打包到`target/classes`目录。 - **解决**: - 手动检查`target/classes/com/example/mapper`下是否存在`AccountMapper.xml`。 - 若缺失,清理项目后重新编译(如执行`mvn clean install`)。 --- #### **5. 检查是否混合使用XML和注解** - **原因**: 若接口方法同时使用XML和注解(如`@Select`),可能导致冲突。 - **解决**: - 统一使用XML或注解定义SQL,避免重复。 --- #### **6. 验证MyBatis版本兼容性** - **原因**: 旧版本MyBatis可能存在扫描路径的Bug。 - **解决**: - 升级到最新稳定版本(如3.5.13)。 --- ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值