JasperException: la valeur de l'attribut useBean class n'est pas valide

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)

qui peut expliquer la cause et la solution de ce problème?

9
jsp
demandé sur BalusC 2010-06-11 20:33:52

6 réponses

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

donc vous avez un

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

Cette exception est typique lorsque les éléments suivants qui se passe "derrière les coulisses", qui échoue:

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

outre l'exigence qu'il doit être placé à l'intérieur d'un paquet (ce que vous avez donc correctement fait), le haricot devrait lui-même être une classe public et avoir un constructeur (implicite) public no-arg. C'est-à-dire:

package com;

public class b5 {
    public b5() {
        // Default constructor.
    }
}

Normalement ce constructeur est déjà présent, mais cela sera caché chaque fois que vous ajoutez d'autres constructeurs qui prennent d'autres arguments. Vous devrez ensuite ajouter vous-même explicitement.

une autre cause possible est que la classe de haricot ne peut pas être trouvée dans le chemin de classe runtime. S'il s'agit de votre propre haricot, assurez-vous que son fichier class se trouve dans /WEB-INF/classes/com/b5.class . Assurez-vous également que le nom complet com.b5 est littéralement correct, il est sensible à la casse.

You devrait regarder un peu plus loin dans le stacktrace pour la cause exacte du problème. Dirigez-vous vers les parties root cause ou caused by situées au bas de la trace.


cela dit (et sans rapport avec le problème réel), le nom de classe b5 est un très mauvais choix. Il doit s'agir d'un nom sensé commençant par une majuscule, par exemple: User , Product , Order , etc.

11
répondu BalusC 2015-07-06 14:28:32

Essayer type au lieu de classe

La différence selon les documents:

class= " package.classe"type=" paquet.classe" Instancie un haricot de la classe nommée dans la classe et assigne au haricot le type de données que vous spécifiez dans le type. La valeur de type peut être la même que class, une superclasse de class, ou une interface implémentée par class. La classe que vous spécifiez dans la classe ne doit pas être abstrait et doit avoir un public, sans argument constructeur. Les noms de paquets et de classes que vous utilisez avec class et type sont sensibles à la casse. beanName= " {package.classe/} " type="paquet.classe" Instancie un bean d'une classe, un template sérialisé, ou une expression qui évalue vers une classe ou un template sérialisé. Lorsque vous utilisez beanName, la fève est instanciée par le java.haricot.Haricot.instancier méthode. haricot.la méthode instanciate vérifie si le paquet et la classe que vous spécifiez représentent une classe ou un sérialisé modèle. S'ils représentent un modèle sérialisé, Beans.instantiate lit la forme sérialisée (qui a un nom comme paquet.classe.ser) utilisant un chargeur de classe. La valeur de type peut être la même que beanName, une superclasse de beanName, ou une interface implémentée par beanName. Les noms de paquets et de classes que vous utilisez avec à la fois beanName et type sont sensibles à la casse.
4
répondu Pratyusha 2012-11-30 09:23:49

j'ai eu le même problème. En outre assurez-vous pensé à régler votre classe elle-même de "public",

1
répondu Robyn P 2011-06-22 19:45:48

au lieu de

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

utilisation

<jsp:useBean id='b5'>

<jsp:attribute name="class" trim="true">com.b5</jsp:attribute>

</jsp:useBean>


redémarrez également le serveur tomcat après les modifications

1
répondu The EasyLearn Academy 2012-11-22 11:39:59

j'ai eu le même problème et comme souligné ci-dessus, j'ai oublié d'ajouter le constructeur par défaut car j'en avais ajouté un dépassé.

java de base, le compilateur ajoute un constructeur arg par défaut dans chaque classe que vous créez, sauf quand vous ajoutez explicitement un constructeur.

0
répondu Khalid 2012-10-18 19:54:03

votre espace de travail ont la classe qui avait besoin en useBean, donc en travaillant il ne lancera pas de message d'erreur. Mais lorsque vous avez déployé l'application, elle s'est déployée comme prévu.fichier de propriétés.Il est possible que votre classe ne soit pas déployée. Vérifiez votre déploiement.fichier de propriétés.Espérons que cela fonctionnera!!

0
répondu CodeNinja 2017-05-09 10:28:03