1

I am migrating a project from legacy spring to springboot. Project uses Spring Webflow and plan to keep the configurations intact for webflow and port the project to springboot by updating the project structure and adding necessary boot libraries.

Currently stuck with a jasperexception from the embedded tomcat jasper libraries complaining that the class used in the method signature of TLD for a function is not found.

org.apache.jasper.JasperException: The class [javax.servlet.http.HttpServletRequest request] specified in the method signature in TLD for the function [mytld:getAppLink] cannot be found. [javax.servlet.http.HttpServletRequest request] at org.apache.jasper.compiler.DefaultErrorHandler.jspError(DefaultErrorHandler.java:55) ~[tomcat-embed-jasper-9.0.36.jar!/:9.0.36] at org.apache.jasper.compiler.ErrorDispatcher.dispatch(ErrorDispatcher.java:294) ~[tomcat-embed-jasper-9.0.36.jar!/:9.0.36] at org.apache.jasper.compiler.ErrorDispatcher.jspError(ErrorDispatcher.java:81) ~[tomcat-embed-jasper-9.0.36.jar!/:9.0.36]

If I update the function in TLD to a no argument function, it works fine at that point. But moment I have a class to pass in the constructor this error is thrown.

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>

Here is snippet of my tld:

<?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>

Here is snippet of function getAppLink from AppWebFunctions class:

/**
     * 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;
    }
HKA
  • 13
  • 3

1 Answers1

1

If I update the function in TLD to a no argument function, it works fine at that point. But moment I have a class to pass in the constructor this error is thrown.

That's because <function-signature> does not include any parameter names, only the fully-qualified class name of the parameter's type can be specified.

So, just remove the request parameter name and the TLD should work then.

<function-signature>
    java.lang.String getAppLink(javax.servlet.http.HttpServletRequest)
</function-signature>
Ravi K Thapliyal
  • 51,095
  • 9
  • 76
  • 89
  • Thank you Ravi. That worked for spring boot. Still am curious on why this worked on Weblogic. But that question is OBE. – HKA Aug 04 '21 at 19:08
  • @HKA I'm glad it worked. If you found my post helpful, you can optionally up vote as well :) Thanks. – Ravi K Thapliyal Aug 05 '21 at 15:11
  • I tried. seems like I don't have enough reputation to cast a vote. website isn't allowing... – HKA Aug 05 '21 at 17:28