[jboss-user] [Installation, Configuration & DEPLOYMENT] - JBoss + custom tags error

starkc do-not-reply at jboss.com
Fri Jan 4 10:28:59 EST 2008


I have a confounding error while doing a migration from WebLogic to JBoss involving custom JSP tags.  Tags appear to stop instantiating new tag objects between requests.  The first few times I hit a page, it will perform the tag correctly, but later requests result in errors that seem to trace back to the tag object itself not being instantiated.  I post this here in the configuration forum because the code has worked before and I'm willing to bet I have a small error that may be tripping everything here up.

As an example, I coded a custom tag that loops over the values in an ArrayList and prints trace statements to the console and to the jsp that uses the tag.

Tag:

  | package com.cybersource.riskmanager.admin.tag;
  | 
  | import java.io.IOException;
  | import java.sql.SQLException;
  | import java.util.ArrayList;
  | import javax.naming.NamingException;
  | import javax.servlet.jsp.JspTagException;
  | import javax.servlet.jsp.PageContext;
  | import javax.servlet.jsp.tagext.IterationTag;
  | import javax.servlet.jsp.tagext.TagSupport;
  | 
  | public class TestBusinessListTag extends TagSupport implements IterationTag
  | {
  | 
  |     private ArrayList businesses = new ArrayList();
  | 
  |     private int numBusinesses;
  |     private int currentBusiness;
  | 
  |     public TestBusinessListTag()
  |     {
  |    		System.out.println( "DEBUG ---- CONSTRUCTOR" );
  | 
  |         businesses.add( "a" );
  |     	businesses.add( "b" );
  |     	businesses.add( "c" );
  |     	businesses.add( "d" );
  | 		
  |         numBusinesses = 0;
  |         currentBusiness = 0;
  |     }
  |     
  |     public void resetAll()
  |     {
  |     	businesses.clear();
  |     	businesses.add( "a" );
  |     	businesses.add( "b" );
  |     	businesses.add( "c" );
  |     	businesses.add( "d" );
  |     	
  |     	currentBusiness = 0;
  |     }
  |     
  |     public int doStartTag() throws JspTagException
  |     {
  |     	try
  |         {
  |     		pageContext.getOut().print( "doStartTag()<br>" );
  |         }
  |     	catch( IOException ioe )
  |     	{
  |     		throw new JspTagException( ioe.getMessage() );
  |     	}
  | /*        catch(NamingException namingexception)
  |         {
  |             throw new JspTagException("Unable to contact the database connection pool to get a connection.");
  |         }
  |         catch(SQLException sqlexception)
  |         {
  |             throw new JspTagException("The database query to retrieve the list of businesses failed.");
  |         }
  | */
  |         numBusinesses = businesses.size();
  |         if(numBusinesses > 0)
  |         {
  |             super.pageContext.setAttribute("anyBusinesses", Boolean.TRUE);
  |             nextBusiness();
  |             return 1;
  |         } else
  |         {
  |             super.pageContext.setAttribute("anyBusinesses", Boolean.FALSE);
  |             return 0;
  |         }
  |     }
  | 
  |     public int doEndTag() throws JspTagException
  |     {
  |     	try
  |         {
  |     		pageContext.getOut().print( "doEndTag()<br>" );
  |         }
  |     	catch( IOException ioe )
  |     	{
  |     		throw new JspTagException( ioe.getMessage() );
  |     	}
  |     	
  |         super.pageContext.removeAttribute("rowBusiness");
  |         return 6;
  |     }
  | 
  |     public int doAfterBody() throws JspTagException
  |     {
  |     	try
  |         {
  |     		pageContext.getOut().print( "doAfterTag()<br>" );
  |         }
  |     	catch( IOException ioe )
  |     	{
  |     		throw new JspTagException( ioe.getMessage() );
  |     	}
  |     	
  |     	
  |         if(currentBusiness == numBusinesses)
  |         {
  |         	System.out.println( currentBusiness + " == " + numBusinesses );
  |             return 0;
  |         } 
  |         else
  |         {
  |         	System.out.println( currentBusiness + " != " + numBusinesses );
  |             nextBusiness();
  |             return 2;
  |         }
  |     }
  | 
  |     public void nextBusiness() throws JspTagException
  |     {
  |     	if( currentBusiness >= numBusinesses )
  |     	{
  |     		System.out.println( "You cant fool me!" );
  |     		//resetAll();
  |     	}
  |     	
  |     	try
  |         {
  |     		pageContext.getOut().print( "nextBusiness()<br>" );
  |     		pageContext.getOut().print( "CURRENT BUSINESS: " + (String)businesses.get(currentBusiness) );    		
  |         }
  |     	catch( IOException ioe )
  |     	{
  |     		throw new JspTagException( ioe.getMessage() );
  |     	}
  | 
  |     	super.pageContext.setAttribute("rowBusiness", businesses.get(currentBusiness));
  |     	currentBusiness++;
  |     	
  |     }
  | }
  | 

Which is embedded in a simple jsp as follows:
 
  | <%@ page import="com.cybersource.riskmanager.admin*" %>
  | <%@ taglib uri="/riskmanageradmin" prefix="rma" %>
  | 
  | <html>
  | 	<body>
  | 		<h1>Testing sample tag</h1>
  | 	
  | 		<rma:test-business-list>
  | 			<br>
  | 			INSIDE TAG
  | 			<br>
  | 		</rma:test-list>
  | 	
  | 	</body>
  | </html>
  | 

When this runs, it will begin by running correctly, spitting out tracing statements as it goes through the logic of the tag, along with the "INSIDE TAG" tracing to show that it is going through the inside of the tag as well.

After a refresh or two, an error is returned, as follows:

  | org.apache.jasper.JasperException: Exception in JSP: /testtag.jsp:8
  | 
  | 5: 	<body>
  | 6: 		<h1>Testing sample tag</h1>
  | 7: 	
  | 8: 		<rma:test-business-list>
  | 9: 			<br>
  | 10: 			INSIDE TAG
  | 11: 			<br>
  | 
  | 
  | Stacktrace:
  | 	org.apache.jasper.servlet.JspServletWrapper.handleJspException(JspServletWrapper.java:504)
  | 	org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:393)
  | 	org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:314)
  | 	org.apache.jasper.servlet.JspServlet.service(JspServlet.java:264)
  | 	javax.servlet.http.HttpServlet.service(HttpServlet.java:810)
  | 	org.jboss.web.tomcat.filters.ReplyHeaderFilter.doFilter(ReplyHeaderFilter.java:96)
  | 
  | root cause
  | 
  | java.lang.IndexOutOfBoundsException: Index: 4, Size: 4
  | 	java.util.ArrayList.RangeCheck(ArrayList.java:507)
  | 	java.util.ArrayList.get(ArrayList.java:324)
  | 	com.cybersource.riskmanager.admin.tag.TestBusinessListTag.nextBusiness(TestBusinessListTag.java:127)
  | 	com.cybersource.riskmanager.admin.tag.TestBusinessListTag.doStartTag(TestBusinessListTag.java:67)
  | 	org.apache.jsp.testtag_jsp._jspx_meth_rma_test$1business$1list_0(testtag_jsp.java:92)
  | 	org.apache.jsp.testtag_jsp._jspService(testtag_jsp.java:66)
  | 	org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:97)
  | 	javax.servlet.http.HttpServlet.service(HttpServlet.java:810)
  | 	org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:332)
  | 	org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:314)
  | 	org.apache.jasper.servlet.JspServlet.service(JspServlet.java:264)
  | 	javax.servlet.http.HttpServlet.service(HttpServlet.java:810)
  | 	org.jboss.web.tomcat.filters.ReplyHeaderFilter.doFilter(ReplyHeaderFilter.java:96)
  | 

The tag appears to pick up where it left off after the previous request, and jumps into the nextBusiness() method, where it errors out by trying to get a value out of the bounds of the ArrayList.

If I uncomment the resetAll() method in nextBusiness(), the tag works as intended to, every time, unfortunately this is not a viable solution for the migration.


Thanks for your help and comments in advance

View the original post : http://www.jboss.com/index.html?module=bb&op=viewtopic&p=4117095#4117095

Reply to the post : http://www.jboss.com/index.html?module=bb&op=posting&mode=reply&p=4117095



More information about the jboss-user mailing list