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)

Может ли кто-нибудь объяснить причину и решение этой проблемы?

Ответ 1

The value for the useBean class attribute com.b5 is invalid.

Итак, у вас есть

<jsp:useBean id="b5" class="com.b5" />

Это исключение обычно, когда происходит следующее "за кадром":

com.b5 b5 = new com.b5();

Помимо требования, что он должен быть помещен в пакет (что вы таким образом правильно сделали), бин сам должен быть классом public и иметь (неявный) конструктор public no-arg. Т.е.

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-компонента не найден в пути к классам среды выполнения. Если это ваш собственный компонент, убедитесь, что его файл class находится в /WEB-INF/classes/com/b5.class. Также убедитесь, что полное квалифицированное имя com.b5 буквально правильно, с учетом регистра. Затем вам следует поискать в трассировке стека чуть более точную причину проблемы. Отправляйтесь на части root cause или caused by в нижней части трассы.


Тем не менее, (и не имеет отношения к реальной проблеме), имя класса b5 является довольно неудачным выбором. Это должно быть разумное имя, начинающееся с заглавной буквы, например, User, Product, Order и т.д. Кроме того, использование <jsp:useBean> вместо контроллера на основе сервлета является плохой практикой. Если вы новичок в сервлетах, начните с страницы вики сервлетов.

Ответ 2

Попробуйте напечатать вместо class

Разница согласно документации:

class= "package.class" type = "package.class" Выдает команду bean из класса, названного в классе, и присваивает bean тип данных, который вы указываете в типе. Значение типа может быть таким же, как класс, суперкласс класса или интерфейс, реализованный классом. Класс, который вы укажете в классе, не должен быть абстрактным и должен иметь открытый конструктор без аргументов. Названия пакетов и классов, которые вы используете с классом и типом, чувствительны к регистру. beanName = "{package.class |}" type = "package.class" Создает экземпляр bean из класса, сериализованного шаблона или выражения, которое оценивает класс или сериализованный шаблон. Когда вы используете beanName, bean создается методом java.beans.Beans.instantiate. Метод Beans.instantiate проверяет, соответствует ли указанный вами пакет и класс классу или сериализованному шаблону. Если они представляют собой сериализованный шаблон, Beans.instantiate считывает сериализованную форму (которая имеет имя типа package.class.ser), используя загрузчик классов. Значение типа может быть таким же, как beanName, суперкласс класса beanName или интерфейс, реализованный beanName. Имена пакетов и классов, которые вы используете как с beanName, так и с типом, чувствительны к регистру.

Ответ 3

У меня была такая же проблема. В дополнение к приведенному выше, убедитесь, что вы запомнили, чтобы настроить свой класс на "общедоступный"

Ответ 4

вместо <jsp:useBean id="b5" class="com.b5" />
использовать
<jsp:useBean id='b5'>
<jsp:attribute name="class" trim="true">com.b5</jsp:attribute>
</jsp:useBean>

также перезапустите сервер tomcat после изменений

Ответ 5

У меня была такая же проблема и, как было подчеркнуто выше, я забыл добавить конструктор по умолчанию, поскольку я добавил переопределенный.

Базовый java, компилятор добавляет конструктор arg по умолчанию в любой класс, который вы создаете, за исключением случаев, когда вы явно добавляете конструктор.

Ответ 6

В вашей рабочей области есть класс, который необходим в useBean, поэтому во время работы он не будет вызывать никакого сообщения об ошибке. Но когда вы развернули приложение, которое оно развернуто в соответствии с файлом deploy.properties. Возможно, что ваш класс, который вы использовали в useBean, не развертывается. Проверьте файл deploy.properties.Надеюсь, что это сработает!