Класс, указанный в сигнатуре метода функции TLD, не найден — JasperException

#spring-boot #jsp #spring-webflow #tld #classnotfound

Вопрос:

Я переношу проект из устаревшей весны в springboot. Проект использует Spring Webflow и планирует сохранить конфигурации для webflow и перенести проект на springboot, обновив структуру проекта и добавив необходимые загрузочные библиотеки.

В настоящее время застрял с исключением jasperexception из встроенных библиотек tomcat jasper, жалующихся на то, что класс, используемый в сигнатуре метода TLD для функции, не найден.

org.apache.jasper.JasperException: Класс [javax.servlet.http.Запрос HttpServletRequest], указанный в подписи метода в TLD для функции [mytld:getAppLink], не может быть найден. [javax.сервлет.http.Запрос HttpServletRequest] в org.apache.jasper.compiler.DefaultErrorHandler.jspError(DefaultErrorHandler.java:55) ~[tomcat-embed-jasper-9.0.36.jar!/:9.0.36] в org.apache.jasper.компилятор.ErrorDispatcher.dispatch(ErrorDispatcher.java:294) ~[tomcat-embed-jasper-9.0.36.jar!/:9.0.36] в орг.apache.джаспер.компилятор.ErrorDispatcher.jspError(ErrorDispatcher.java:81) ~[tomcat-embed-jasper-9.0.36.jar!/:9.0.36]

Если я обновлю функцию в TLD до функции без аргументов, в этот момент она будет работать нормально. Но в тот момент, когда у меня есть класс для передачи в конструкторе, возникает эта ошибка.

JSP:

 <%@ include file="/WEB-INF/jsp/includes/includes.jspf" %>
<%@ taglib prefix="mytld" uri="MyTldLibrary" %>
<div id="header" class="style-header">
    <div id="headm">
        <a href="${mytld:getAppLink(pageContext.request)}" class="logos"></a>
        
    </div>
</div>
 

Вот фрагмент моего дву:

 <?xml version="1.0" encoding="UTF-8" ?>

<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_2.xsd"
    version="2.0">

    <tlib-version>2.2</tlib-version>
    <jsp-version>3.0</jsp-version>
    <short-name>mytld</short-name>
    <uri>MyTldLibrary</uri>
    <description>App EL Functions</description>
    
    <function>
        <name>getAppLink</name>
        <function-class>
            com.app.web.tags.AppWebFunctions
        </function-class>
        <function-signature>
            java.lang.String getAppLink(javax.servlet.http.HttpServletRequest request)
        </function-signature>
    </function>
</taglib>
 

Вот фрагмент функции getAppLink из класса AppWebFunctions:

 /**
     * Gets the App link.
     *
     * @param request the request
     * @return the App link
     * @throws UnsupportedEncodingException the unsupported encoding exception
     */
    public static final String getAppLink(final HttpServletRequest request) throws UnsupportedEncodingException {
        //LOGIC to retrieve applink
        return appLink;
    }
 

Ответ №1:

Если я обновлю функцию в TLD до функции без аргументов, в этот момент она будет работать нормально. Но в тот момент, когда у меня есть класс для передачи в конструкторе, возникает эта ошибка.

Это связано <function-signature> с тем, что не содержит никаких имен параметров, можно указать только полное имя класса типа параметра.

Итак, просто удалите имя request параметра, и тогда TLD должен работать.

 <function-signature>
    java.lang.String getAppLink(javax.servlet.http.HttpServletRequest)
</function-signature>
 

Комментарии:

1. Спасибо тебе, Рави. Это сработало для spring boot. До сих пор мне любопытно, почему это сработало на Weblogic. Но этот вопрос-ВТО.

2. @HKA Я рад, что это сработало. Если вы нашли мой пост полезным, вы также можете проголосовать 🙂 Спасибо.

3. Я пытался. похоже, у меня недостаточно репутации, чтобы голосовать. веб-сайт не позволяет…