2015-02-03 3 views
9

Мне нужно реализовать несколько пользовательских функций для страницы JSP, и для этого мне нужно создать собственный taglib. Это должно быть простое действие, но на первом этапе у меня возникла проблема, когда я просто добавляю пустой taglib. Я получил исключение:NullPointerException при добавлении пользовательского taglib в 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) 
    ... 

Мой собственный TLD (помещенный в 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" %> 

Кроме того, я пытался добавить некоторые функции в custom.tld, но без каких-либо изменений.

Может кто-нибудь мне помочь? Что я делаю не так?

+0

NullPointerException в точках TldResourcePath.156 к отсутствующему объекту URL в RldResourcePath Object. Возможно, возникла проблема с вашим определением URI. – Luke

ответ

10

Вам необходимо переместить файл custom.tld где-нибудь в каталоге /WEB-INF, чтобы найти его и сопоставить со значением, указанным в /<taglib>/<uri>.

Если по какой-либо причине вы не можете, вы должны добавить <taglib>, сопоставляя ваш файл web.xml.

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

The <taglib-location> задается относительно корневой веб-приложений. При необходимости измените.

+0

Я нашел небольшую ошибку в своем вопросе, мой tld размещен в webapp/custom.tld (вместо webportal). Но в любом случае, когда я заменил его в WEB-INF и изменил uri, он начал работать! Я уверен, что я пробовал это раньше, но я думаю, что я не сделал что-то важное (может быть, я не изменил uri ...). Итак, спасибо за вашу помощь! – Vartlok

+0

Приятно знать, что у вас это работает. –

+0

Спасибо, это работает. Есть ли соответствующий документ? –

7

Я потратил 4 часа на исправление этого. Я переключился с Tomcat 6 на Tomcat 8 и начал получать тот же NPE. Я в конечном итоге к выводу, что проблема заключается в импорте мой TagLib

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

Оказалось, что Tomcat 8 Jasper терпит неудачу на импорт с относительным путем. Я изменил его

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

и определил TagLib в моих web.xml, как

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

Изменение <% @ taglib uri = "includes/tt.tld" prefix = "tt"%> to < % @ taglib uri = "/ includes/tt.tld" prefix = "tt"%> решил для меня, исходя из того, что вы сказали об относительных путях. – michelpm

Смежные вопросы