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?
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.
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.
j'ai eu le même problème. En outre assurez-vous pensé à régler votre classe elle-même de "public",
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
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.
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!!