【问题标题】:JasperException: The value for the useBean class attribute is invalidJasperException:useBean 类属性的值无效
【发布时间】:2011-03-02 18:09:54
【问题描述】:
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)

谁能解释一下这个问题的原因和解决方法?

【问题讨论】:

  • 您能发布导致此错误的代码吗?

标签: jsp


【解决方案1】:
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 is optional when there are no other constructors.
    }
}

通常这个构造函数已经存在,但是当你添加其他接受其他参数的构造函数时,它会被隐藏。然后,您需要自己显式添加它。

package com;

public class b5 {

    public b5(String argument) {
        // Non-default constructor.
    }

    public b5() {
        // You need to explicitly add a default constructor.
    }
}

另一个可能的原因是在运行时类路径中找不到 bean 类。如果这是您自己的 bean,请确保其 class 文件位于 /WEB-INF/classes/com/b5.class 中。还要确保完整的限定名称com.b5 字面上正确,它区分大小写。然后,您应该在堆栈跟踪中进一步查看问题的确切原因。前往跟踪底部的root causecaused by 部分。


也就是说(与实际问题无关),类名b5 是一个非常糟糕的选择。它应该是一个以大写开头的合理名称,例如UserProductOrder 等。此外,使用 &lt;jsp:useBean&gt; 而不是基于 servlet 的控制器是一种不好的做法。如果您不熟悉 servlet,请从 servlets wiki page 开始。

【讨论】:

  • 嗨!我有同样的问题,但我的classes 不在WEB-INF 文件夹内。但是,我不想更改我的类文件夹位置。你知道有什么方法可以为类目录预编译具有不同位置的 jsp 文件吗?
  • 我刚刚遇到了这个问题,无论出于何种原因,今天 Netbeans 都没有将类文件放在我的 /build/web/WEB-INF/classes/ 中。我没有做任何更改,并且经常使用此代码。我做了一些随机的小改动,重新编译,然后它就出现了。
  • @BalusC 添加默认构造函数有效。但是你能告诉我为什么我需要它吗?如果我们没有它,程序就不能正常工作吗?就我而言,我从不使用无参数构造函数,但看起来我 must 拥有它。为什么会这样?
【解决方案2】:

尝试 type 而不是 class

根据文档的区别:

class="package.class" 类型="package.class" 从 class 中命名的类实例化一个 bean,并为 bean 分配您在 type 中指定的数据类型。 type 的值可以与类、类的超类或类实现的接口相同。 您在 class 中指定的类不能是抽象的,并且必须具有公共的、无参数的构造函数。与类和类型一起使用的包名和类名区分大小写。 beanName="{package.class | }" type="package.class" 从类、序列化模板或计算结果为类或序列化模板的表达式实例化 bean。当您使用 beanName 时,该 bean 由 java.beans.Beans.instantiate 方法实例化。 Beans.instantiate 方法检查您指定的包和类是表示类还是序列化模板。如果它们表示序列化模板,Beans.instantiate 使用类加载器读取序列化表单(其名称类似于 package.class.ser)。 type 的值可以和 beanName 相同,也可以是 beanName 的超类,也可以是 beanName 实现的接口。与 beanName 和 type 一起使用的包名和类名区分大小写。

【讨论】:

    【解决方案3】:

    我也遇到了同样的问题。除了上述之外,请确保您记得将您的课程本身设置为“公共”

    【讨论】:

      【解决方案4】:

      我遇到了同样的问题,正如上面强调的那样,我忘记添加默认构造函数,因为我添加了一个被覆盖的构造函数。

      Basic java,编译器会在您创建的每个类中添加一个默认的无参数构造函数,除非您显式添加构造函数。

      【讨论】:

        【解决方案5】:

        而不是
        &lt;jsp:useBean id="b5" class="com.b5" /&gt;
        使用
        <jsp:useBean id='b5'>
        <jsp:attribute name="class" trim="true">com.b5</jsp:attribute>
        </jsp:useBean>

        修改后也要重启tomcat服务器

        【讨论】:

          【解决方案6】:

          您的工作区具有 useBean 所需的类,因此在工作时不会抛出任何错误消息。但是,当您部署应用程序时,它会按照 deploy.properties 文件进行部署。您在 useBean 中使用的类可能没有被部署。 检查您的 deploy.properties 文件。希望它能正常工作!

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2012-04-21
            • 2013-11-04
            • 2011-11-12
            • 2010-10-07
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多