2015-02-03 5 views
9

Ich muss ein paar benutzerdefinierte Funktionen für JSP-Seite implementieren und dafür muss ich benutzerdefinierte Taglib erstellen. Es sollte eine einfache Aktion sein, aber ich habe ein Problem beim ersten Schritt, wenn ich einfach eine leere Taglib hinzufüge. Ich habe eine Ausnahme:NullPointerException beim Hinzufügen benutzerdefinierte Taglib in JSP

java.lang.NullPointerException 
    at org.apache.tomcat.util.descriptor.tld.TldResourcePath.hashCode(TldResourcePath.java:156) 
    at java.util.HashMap.hash(HashMap.java:338) 
    at java.util.HashMap.get(HashMap.java:556) 
    at org.apache.jasper.compiler.TldCache.getTaglibXml(TldCache.java:95) 
    at org.apache.jasper.compiler.TagLibraryInfoImpl.<init>(TagLibraryInfoImpl.java:179) 
    at org.apache.jasper.compiler.Parser.parseTaglibDirective(Parser.java:411) 
    at org.apache.jasper.compiler.Parser.parseDirective(Parser.java:469) 
    at org.apache.jasper.compiler.Parser.parseElements(Parser.java:1428) 
    at org.apache.jasper.compiler.Parser.parse(Parser.java:139) 
    at org.apache.jasper.compiler.ParserController.doParse(ParserController.java:227) 
    at org.apache.jasper.compiler.ParserController.parse(ParserController.java:100) 
    at org.apache.jasper.compiler.Compiler.generateJava(Compiler.java:199) 
    at org.apache.jasper.compiler.Compiler.compile(Compiler.java:356) 
    at org.apache.jasper.compiler.Compiler.compile(Compiler.java:336) 
    at org.apache.jasper.compiler.Compiler.compile(Compiler.java:323) 
    ... 

Meine benutzerdefinierte TLD (platziert in Webapp/custom.tld):

<?xml version="1.0"> 
<taglib xmlns="http://java.sun.com/xml/ns/j2ee" 
     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
     xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee/web-jsptaglibrary_2_0.xsd" 
     version="2.0"> 

    <tlib-version>1.0</tlib-version> 
    <short-name>MyLibrary</short-name> 
    <uri>myTagLib</uri> 

</taglib> 

JSP:

<%@ taglib prefix="myTag" uri="myTagLib" %> 

Auch habe ich versucht, eine Funktion hinzuzufügen, in custom.tld, aber ohne Änderungen.

Kann mir jemand helfen? Was mache ich falsch?

+0

Die Nullpointer in TldResourcePath.156 verweist auf eine fehlende URL Objekt im RldResourcePath Objekt. Möglicherweise liegt ein Problem mit Ihrer URI-Definition vor. – Luke

Antwort

10

Sie müssen Ihre custom.tld Datei irgendwo in das Verzeichnis /WEB-INF verschieben, damit der Container den Wert finden und zuordnen kann, der unter /<taglib>/<uri> bereitgestellt wird.

Wenn Sie aus irgendeinem Grund nicht können, sollten Sie eine <taglib> Zuordnung zu Ihrer web.xml Datei hinzufügen.

<jsp-config> 
    <taglib> 
    <taglib-uri>myTagLib<taglib-uri> 
    <taglib-location>/webportal/custom.tld<taglib-location> 
    </taglib> 
</jsp-config> 

Die <taglib-location> relativ zu Ihrer Web-Anwendung root angegeben. Ändern Sie, falls erforderlich.

+0

Ich habe einen kleinen Fehler in meiner Frage gefunden, mein Tld in webapp/custom.tld (anstelle von Webportal). Aber wie auch immer, als ich es in WEB-INF ersetzte und uri änderte, fing es an zu arbeiten! Ich bin mir sicher, dass ich es vorher versucht habe, aber ich denke, ich habe keine wichtige Sache gemacht (vielleicht habe ich nicht uri geändert ...). Also, danke für deine Hilfe! – Vartlok

+0

Gut zu wissen, dass es funktionierte. –

+0

Danke, es funktioniert. Gibt es ein relevantes Dokument? –

7

Ich habe 4 Stunden damit verbracht, dies zu beheben. Ich habe von Tomcat 6 auf Tomcat 8 gewechselt und habe angefangen, dieselbe NPE zu bekommen. Ich landete festgestellt, dass das Problem in den Import meiner taglib

<%@ taglib uri="/includes/tt.tld" prefix="tt" %> 

stellte sich heraus, war, dass Tomcat 8 Jasper auf die Einfuhren mit relativer Pfad ausfällt. Habe ich es zu

<%@ taglib uri="myTagLib" prefix="tt" %> 

und definiert taglib in meinem web.xml als

<jsp-config> 
    <taglib> 
     <taglib-uri>myTagLib</taglib-uri> 
     <taglib-location>/includes/tt.tld</taglib-location> 
    </taglib> 
</jsp-config> 
+1

Ändern von <% @ taglib uri = "includes/tt.tld" prefix = "tt"%> bis < % @ taglib uri = "/ includes/tt.tld" prefix = "tt"%> hat es für mich gelöst, basierend auf dem, was Sie über relative Pfade gesagt haben. – michelpm