搜索
查看
编辑修改
首页
UNITY
NODEJS
PYTHON
AI
GIT
PHP
GO
CEF3
JAVA
HTML
CSS
搜索
知新_RL
这个屌丝很懒,什么也没留下!
关注作者
热门标签
jquery
HTML
CSS
PHP
ASP
PYTHON
GO
AI
C
C++
C#
PHOTOSHOP
UNITY
iOS
android
vue
xml
爬虫
SEO
LINUX
WINDOWS
JAVA
MFC
CEF3
CAD
NODEJS
GIT
Pyppeteer
article
热门文章
1
Rust Web开发框架actix-web入门案例
2
基于python机器学习算法的农作物产量可视化分析预测系统(完整系统源码+数据库+详细文档+论文+部署教程)_农作物产量预测系统
3
HDFS文件系统与普通分布式文件系统的差别_比较hadoop的分布式文件系统hdfs与传统文件系统的区别。
4
Spark:写入CSV文件
5
SQL 游标使用实例
6
鸿蒙HarmonyOS应用开发之Node-API常见问题(1),2024年最新HarmonyOS鸿蒙开发社招面试经验_libentry.so 改名
7
Docker Desktop requires a newer WSL kernel version.
8
微信小程序【网易云音乐实战】(第六篇 歌曲搜索、自定义模板、分包)_网易云搜索功能微信小程序
9
堆的基本操作和堆排序
10
在阿里巴巴做外包的那些日子...._阿里一个外包岗位会给外包公司多少钱
当前位置:
article
> 正文
详解 Tomcat: The value for the useBean class attribute is invalid 问题_idea中usebean类属性值无效
作者:知新_RL | 2024-05-26 02:53:07
赞
踩
idea中usebean类属性值无效
详解 Tomcat: The value for the useBean class attribute is invalid 问题
使用Tomcat 常见 "The value for the useBean class attribute is invalid" 错误。该错误是指 JSP 中给定的 useBean 标签的 class 属性的值无效(不是 Bean 的属性值)。
在说明这个问题前,先看看有关的 Tomcat 源代码(org.apache.jasper.compiler.Generator):
if (beanName == null) {
try {
Class bean = ctxt.getClassLoader().loadClass(klass);
int modifiers = bean.getModifiers();
if (!Modifier.isPublic(modifiers) ||
Modifier.isInterface(modifiers) ||
Modifier.isAbstract (modifiers)) {
throw new Exception("Invalid bean class modifier");
}
// Check that there is a 0 arg constructor
bean.getConstructor(new Class[] {});
generateNew = true;
} catch (Exception e) {
// Cannot instantiate the specified class
if (ctxt.getOptions().getErrorOnUseBeanInvalidClassAttribute()) {
err.jspError(n, "jsp.error.invalid.bean ", klass);
}
}
}
可见错误可能的原因包括:
1. 在编译 JSP 时(不是运行时),指定的 Bean 类没找到
2. Bean 虽然找到了,但是它不是 public 的,或者找到的 class 文件是 interface 或抽象类
3. Bean 类中没有 public 的默认构建函数
第二点很明显,不用多解释,最经常发生的情况是 Bean 类忘了声明为 public 。
第三点中需要注意的是,如果你的 Bean 类没有提供任何构造函数,将自动生成一个默认构建函数,这没有问题。但是,如果你有构造函数,则不会自动生成该默认构造函数。经常被忽略的问题是写了默认构造函数却不是 public 的。
第一点看起来简单,不过却最令人头痛,尤其是在开发环境里。这里需要注意的是,"在编译 JSP 时",意味着引用 Bean 的 JSP 是新的,或者刚刚更新过,或者 TOMCAT_HOME/work 中的编译结果被清除了。此时,Tomcat 将自动(重新)编译该 JSP,此时如果发现 Bean 没找到,就会报这个错。情况因为 JSP 或者 Bean 类正在开发而变得复杂,一一列举所有情况没有意义,这里我举一些典型例子,借此应该可以举一反三:
如果 JSP 编译结果存在,且 JSP 没有更新,Tomcat 不会重新编译 JSP,同时默认情况也不会自动重新加载更新过的 Bean 类(参考 http://jakarta.apache.org/tomcat/tomcat-5.5-doc/config/context.html 中的 reloadable)。所以,你会发现此时即使删除了 Bean 类都没有问题,当然,更新 Bean 类也不会有什么用。如果在 JSP 编译产生之后,我们重起了服务器,由于 JSP 文件编译的结果存在,所以,可以仍然访问 JSP 页面,而不必重新编译。可是如果访问前,删掉了 Bean 类,就会报过 ClassNotFoundException 而不是上述错误。关键在于 JSP 是否经过编译,没有编译则没有找到类报告题目中的编译错误 ,编译过则是 ClassNotFoundException 运行时实例化错误。
还有一个更为特殊的例子。如果 Web 应用在启动时, WEB-INF/classes 目录不存在,则在启动应用后,新建 classes 目录,动态添加新的类进去是没有用的,会报告同样的错误。原因是此时的 Tomcat 不会去检查该目录,也就不会找到你需要的类。对 WEB-INF/lib 目录也是同样。这一点可以参考下面的源代码(org.apache.catalina.loader.WebappLoader):
// Setting up the class repository (/WEB-INF/classes), if it exists
String classesPath = "/WEB-INF/classes";
DirContext classes = null;
try {
Object object = resources.lookup(classesPath);
if (object instanceof DirContext) {
classes = (DirContext) object;
}
} catch(NamingException e) {
// Silent catch: it's valid that no /WEB-INF/classes collection
// exists
}
if (classes != null) {
File classRepository = null;
String absoluteClassesPath =
servletContext.getRealPath(classesPath);
if (absoluteClassesPath != null) {
classRepository = new File(absoluteClassesPath);
} else {
classRepository = new File(workDir, classesPath);
classRepository.mkdirs();
copyDir(classes, classRepository);
}
if(log.isDebugEnabled())
log.debug(sm.getString("webappLoader.classDeploy", classesPath,
classRepository.getAbsolutePath()));
// Adding the repository to the class loader
classLoader.addRepository(classesPath + "/", classRepository);
loaderRepositories.add(classesPath + "/" );
}
尽管这个问题的复杂场景可能不一而足,不过解决它的办法却很简单:停止服务器,确认你的 JSP 和 Bean 正确部署,清理掉 TOMCAT_HOME/work 中的内容,重起服务器。 此外,配置动态类加载对开发而言是个不错的选择。
本文基于 Tomcat 5.5.9 版本。
声明:
本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:
https://www.wpsshop.cn/w/知新_RL/article/detail/624862
推荐阅读
article
【提示学习论文】
TCP
:
Textual
-
based
Class
-
aware
Prompt
tunin...
近年来,通过可学习的域共享或图像条件的文本tokens,促进生成适用于特定任务的分类器问题:这些textual toke...
赞
踩
article
Kettle连接
sqlserver
数据库报错_
error
connecting
to databas...
一、报错信息Driver
class
‘net.sourceforge.jtds.jdbc.Driver’ could ...
赞
踩
article
Kettle连接SQL
Server
因加密问题无法连接解决方案_
error
connecting
t...
错误报告:Error
connecting
to
database
: (
using
class
com.microsof...
赞
踩
article
My
SQL
5.7
.4及更高
版本
SQL
error
:
SQL
STATE[22007]
:
Inval...
My
SQL
5.7
.4及更高
版本
默认不允许使用'0000-00-00 00
:
00
:
00'这个特殊值,这是因为这个值不是一...
赞
踩
article
mysql
修改表结构报错:1067 - Invalid
default
value
for
‘字段名...
1067 - Invalid
default
value
for
_1067 - invalid
default
valu...
赞
踩
article
JDK报错: NoSuchFieldError: Class com.sun.
tools
.
javac
...
异常:NoSuchFieldError: Class com.sun.
tools
.
javac
.
tree
.JCTree$J...
赞
踩
article
tomcat
的
HTTPS
配置实操...
tomcat
的
HTTPS
配置实操
tomcat
的
HTTPS
配置实操 因为oracle j...
赞
踩
article
PyTorch
报错
shape
‘[16, 1, 28, 28]‘
is
invalid
for
in...
re
shape
()参数固定太死,导致dataloader最后一次迭代获得结果不满足re
shape
()要求,应该resha...
赞
踩
article
Java热编译热部署插件:
JRebel
_
jrebel
中的
edit
configuration中mai...
修改代码时,会经常遇到一个问题,就是要修改代码,虽然如果是html,css,js这些会立即生效但是像Java代码还是不行...
赞
踩
article
eclipse
中
没有
runtime
environments
_
微信
小
程序
云
开发
环境设置及 “inva...
微信
小
程序
微信
小
程序
云
开发
环境的出现
微信
小
程序
在推出这么长时间以来在不断进行演化。开始主要是作为客户端,后台的服务需要自...
赞
踩
article
Tomcat
启动报错_
invalid
runtimelib
specified
tomcat
报错...
Tomcat
启动报错 : There is insufficient memory for the Java Runt...
赞
踩
article
IDEA 连接
mysql
_
driver
class
'
com
.
mysql
.cj.
jdbc
.drive...
首次使用需要下载驱动程序,不然连接数据库会报错。找到
mysql
,点击驱动程序文件下面的加号,点击提供的驱动程序,选择my...
赞
踩
article
IDEA连接Database报错
Driver
class
‘com.
mysql
.cj.
jdbc
.Dr...
IDEA连接Database报错
Driver
class
'com.
mysql
.cj.
jdbc
.
Driver
' not ...
赞
踩
article
PyCharm中
Driver
class
‘com.
mysql
.cj.
jdbc
.
Driver
‘ no...
打开”Data Sources and
Driver
s“界面,选择”
Driver
s“其他连接的问题请参考下面的连接,非常...
赞
踩
article
tomcat
lib
mysql
_
向
lib
中添加了
mysql
jar
,但仍然无法通过
本地
intell...
Throughout my application I want to add the username and pas...
赞
踩
article
Cannot find
class
:
com
.
mysql
.cj.
jdbc
.
Driver
_
com
.my...
myhabits_
com
.
mysql
.cj.
jdbc
.
driver
pom
com
.
mysql
.cj.
jdbc
.drive...
赞
踩
article
java
- 日常错误总结 -1 Cannot
find
class
:
com
.
mysql
.cj....
现象秒速:Cannot
find
class
:
com
.
mysql
.cj.
jdbc
.Driver错误原因有很多种,依次...
赞
踩
article
完美解决Cannot
find
class
:
com
.
mysql
.cj.
jdbc
.
Driver
...
故障原因:错误提示表明在使用 MyBatis 配置数据源时,无法找到 MySQL 驱动程序
com
.
mysql
.cj.j...
赞
踩
article
Cannot
find
class
:
com
.
mysql
.
jdbc
.
Driver
报错解决...
在maven中更换依赖版本从5.1.47更换为8.0.15正常,但是报了警告:Loading
class
`
com
.my...
赞
踩
article
java
.
lang
.ClassNotFoundException: Cannot find clas...
com
.
mysql
.
jdbc
.
Driver
是
mysql
-connector-
java
5中的,
com
.
mysql
....
赞
踩
相关标签
学习
prompt
语言模型
sqlserver
数据库
etl工程师
mysql
sql
java
mybatis
开发语言
https
网络协议
人工智能
python
pytorch
numpy
pandas
intellij idea
eclipse中没有runtime environments
tomcat
intellij-idea