Cannot find message resources under key org.apache.struts.action.MESSAGE的错误

本文详细解释了在使用Struts框架时出现的Cannotfindmessageresourcesunderkeyorg.apache.struts.action.MESSAGE错误的原因及解决办法。该错误通常是由于web.xml文件中缺少特定的初始化参数配置导致。

Cannot find message resources under key org.apache.struts.action.MESSAGE的错误 。在使用struts的标签时,比如bean标签,有时会发生这个错误。

错误原因:
  web.xml中配置缺失:
    <init-param>
      <param-name>application</param-name>
      <param-value>ApplicationResources</param-value>
    </init-param>
造成原因:可能是JBuilder造成的,呵呵
解决方法:添加上,位置如下:
    <servlet>
    <servlet-name>action</servlet-name>
    <servlet-class>org.apache.struts.action.ActionServlet</servlet-class>
    <init-param>
      <param-name>config</param-name>
      <param-value>/WEB-INF/struts-config.xml</param-value>
    </init-param>
    <init-param>
      <param-name>debug</param-name>
      <param-value>2</param-value>
    </init-param>
    <init-param>
      <param-name>application</param-name>
      <param-value>ApplicationResources</param-value>
    </init-param>
    <load-on-startup>2</load-on-startup>
  </servlet> 

当遇到 `javax.naming.NoInitialContextException: Cannot instantiate class: org.apache.naming.java.javaURLContextFactory` 错误时,通常表明 Java 应用程序在尝试创建 JNDI(Java Naming and Directory Interface)初始上下文时失败。此类问题常见于使用 JNDI 查找数据源(DataSource)或其他资源时配置不当或缺少必要的依赖库。 以下是一些可能的原因和解决方法: ### 1. 检查 `java.naming.factory.initial` 属性配置 确保在创建 `InitialContext` 时,正确设置了 `java.naming.factory.initial` 属性。对于使用 Apache Tomcat 提供的命名服务,应设置为 `org.apache.naming.java.javaURLContextFactory`。例如: ```java Hashtable<String, String> env = new Hashtable<>(); env.put(Context.INITIAL_CONTEXT_FACTORY, "org.apache.naming.java.javaURLContextFactory"); Context context = new InitialContext(env); ``` 如果该属性值中包含多余的空格,例如 `"org.apache.naming.java.javaURLContextFactory "`,则会引发 `NoInitialContextException`,因为 JVM 无法找到带有空格的类名。确保属性值准确无误[^1]。 ### 2. 确保依赖库完整 `org.apache.naming.java.javaURLContextFactory` 是 Apache Tomcat 的一部分,因此确保应用程序运行时环境中包含了 Tomcat 的命名库(如 `catalina.jar` 或 `tomcat-juli.jar`)。如果使用独立的 Java 应用程序而非运行在 Tomcat 中,则可能需要手动将这些 JAR 文件添加到类路径中。 ### 3. 使用 JNDI 资源的替代注入方式 若应用程序部署在支持 Java EE 或 Jakarta EE 的容器中,推荐使用容器管理的 JNDI 资源注入方式,例如通过 `@Resource` 注解注入 `DataSource`,而非手动创建 `InitialContext`。例如: ```java @Resource(name = "jdbc/MyDataSource") private DataSource dataSource; ``` 这种方法避免了直接处理 JNDI 配置的问题,并由容器负责资源的查找与注入[^2]。 ### 4. 检查 Tomcat 的 `context.xml` 配置 如果使用 Tomcat 作为应用服务器,确保在 `context.xml` 或应用特定的 `META-INF/context.xml` 文件中正确定义了 JNDI 资源。例如: ```xml <Context> <Resource name="jdbc/MyDataSource" auth="Container" type="javax.sql.DataSource" maxTotal="100" maxIdle="30" maxWaitMillis="10000" username="dbuser" password="dbpass" driverClassName="com.mysql.cj.jdbc.Driver" url="jdbc:mysql://localhost:3306/mydb"/> </Context> ``` ### 5. 确认 Tomcat 版本兼容性 不同版本的 Tomcat 可能对 JNDI 和命名服务的支持有所差异。确保使用的 `org.apache.naming.java.javaURLContextFactory` 类在当前 Tomcat 版本中存在且兼容。 ### 示例代码:使用 JNDI 查找数据源 ```java import javax.naming.Context; import javax.naming.InitialContext; import javax.sql.DataSource; import java.sql.Connection; public class JndiExample { public static void main(String[] args) throws Exception { Context context = new InitialContext(); DataSource ds = (DataSource) context.lookup("java:comp/env/jdbc/MyDataSource"); try (Connection conn = ds.getConnection()) { // 使用 conn 进行数据库操作 } } } ```
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值