JasperException:useBean类属性的值是无效的
org.apache.jasper.JasperException: /index.jsp(1,1) The value for the useBean class attribute com.b5 is invalid. org.apache.jasper.compiler.DefaultErrorHandler.jspError(DefaultErrorHandler.java:40) org.apache.jasper.compiler.ErrorDispatcher.dispatch(ErrorDispatcher.java:407) org.apache.jasper.compiler.ErrorDispatcher.jspError(ErrorDispatcher.java:148) org.apache.jasper.compiler.Generator$GenerateVisitor.visit(Generator.java:1272) org.apache.jasper.compiler.Node$UseBean.accept(Node.java:1178) org.apache.jasper.compiler.Node$Nodes.visit(Node.java:2361) org.apache.jasper.compiler.Node$Visitor.visitBody(Node.java:2411) org.apache.jasper.compiler.Node$Visitor.visit(Node.java:2417) org.apache.jasper.compiler.Node$Root.accept(Node.java:495) org.apache.jasper.compiler.Node$Nodes.visit(Node.java:2361) org.apache.jasper.compiler.Generator.generate(Generator.java:3426) org.apache.jasper.compiler.Compiler.generateJava(Compiler.java:216) org.apache.jasper.compiler.Compiler.compile(Compiler.java:332) org.apache.jasper.compiler.Compiler.compile(Compiler.java:312) org.apache.jasper.compiler.Compiler.compile(Compiler.java:299) org.apache.jasper.JspCompilationContext.compile(JspCompilationContext.java:586) org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:317) org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:342) org.apache.jasper.servlet.JspServlet.service(JspServlet.java:267) javax.servlet.http.HttpServlet.service(HttpServlet.java:717)
任何人都可以解释这个问题的原因和解决scheme吗?
useBean类属性com.b5的值是无效的。
所以你有一个
<jsp:useBean id="b5" class="com.b5" />
当下面发生的“幕后”失败时,这个例外是典型的:
com.b5 b5 = new com.b5();
除了需要将它放在一个包(你正确地做了这个)之外,这个bean本身应该是一个public
类,并且有一个(隐式的) public
无参构造函数。 即
package com; public class b5 { public b5() { // Default constructor. } }
通常情况下,这个构造函数已经存在,但是只要添加其他构造函数,就会隐藏这个构造函数。 然后您需要明确地添加它。
另一个可能的原因是在运行时类path中找不到bean类。 如果这是你自己的bean,那么确保它的class
文件位于/WEB-INF/classes/com/b5.class
。 还要确保完全限定的名称com.b5
字面上是正确的,它是区分大小写的。
你应该看看进一步的堆栈跟踪问题的确切原因。 findroot cause
或者caused by
跟踪底部的部分caused by
。
这说(和实际问题无关),类名b5
是一个相当差的select。 它应该是一个以大写字母开头的明智名称,例如User
, Product
, Order
等。
尝试键入而不是类
根据文档的不同:
class =“package.class”type =“package.class”从类中指定的类实例化一个bean,并为bean指定在types中指定的数据types。 types的值可以与类,类的超类或类实现的接口相同。 您在类中指定的类不能是抽象的,并且必须有一个公共的,无参数的构造函数。 与类和types一起使用的包和类名称区分大小写。 beanName =“{package.class |}”type =“package.class”从一个类,一个序列化的模板或者一个评估为一个类或序列化模板的expression式实例化一个bean。 当你使用beanName时,这个bean被java.beans.Beans.instantiate方法实例化。 Beans.instantiate方法检查您指定的包和类是代表类还是序列化的模板。 如果它们表示序列化模板,则Beans.instantiate使用类加载器读取序列化表单(其名称类似于package.class.ser)。 types的值可以与beanName,beanName的超类或beanName实现的接口相同。 用于beanName和type的包名和类名区分大小写。
我只是有同样的问题。 除了上面的内容以外,请确保你记得把你的class级本身设置为“公共”
代替
<jsp:useBean id="b5" class="com.b5" />
使用
<jsp:useBean id='b5'>
<jsp:attribute name="class" trim="true">com.b5</jsp:attribute>
</jsp:useBean>
更改后也重启tomcat服务器
我有同样的问题,如上面强调,我忘了添加默认的构造函数,因为我已经添加了一个覆盖。
基本的java,编译器为你创build的每个类添加一个默认的无参数构造函数,除了当你明确地添加一个构造函数。
你的工作空间有useBean需要的类,所以在工作时不会抛出任何错误信息。 但是,当您部署应用程序时,按照deploy.properties文件进行部署。您在useBean中使用的类可能无法部署。 检查你的deploy.properties文件。希望它能起作用!