Servlet rodando jasper reports, porem nao funciona subreport

Bom dia pessoal.

Seguinte, tenho um codigo servlet que gera o relatorio jasper em pdf, ate ae tudo ok, porem o subrelatorio abre em branco.
Quando vejo no ireport ele roda ok, porem quando rodo pelo java, servlet nao abre o subreport, apenas o report principal.

Segue o codigo

o nome do jasper principal e o Recibovd.jasper, e o subreport Recibovd2.jasper

preciso declara esse subreport no meu codigo tb?

import java.io.IOException;  
import java.sql.Connection;  
import java.sql.DriverManager;  
import java.util.HashMap;  
import java.util.Map;  
  
import javax.servlet.ServletContext;  
import javax.servlet.ServletException;  
import javax.servlet.ServletInputStream;  
import javax.servlet.ServletOutputStream;  
import javax.servlet.http.HttpServlet;  
import javax.servlet.http.HttpServletRequest;  
import javax.servlet.http.HttpServletResponse;  
  
import net.sf.jasperreports.engine.JRException;  
import net.sf.jasperreports.engine.JasperReport;  
import net.sf.jasperreports.engine.JasperRunManager;  
import net.sf.jasperreports.engine.util.JRLoader;  
//import org.jfree.chart.servlet.ServletUtilities;  
  
public class Recibo2 extends HttpServlet {  
      
      
    public void doGet(HttpServletRequest request, HttpServletResponse response)  
    throws IOException, ServletException  {  
          
        //String[] vlParametro = request.getParameterValues("nome");  
    	String nomeS = request.getParameter("codig");  
        // obtém a conexão com o banco de dados  
        Connection conn = null;  
        try {  
            Class.forName("org.firebirdsql.jdbc.FBDriver");  
            conn = DriverManager.getConnection(  
                    "jdbc:firebirdsql:localhost/3050:C://banco//BD.FDB?defaultResultSetHoldable=True", // coloque o IP se não for usado localhost  
                    "sysdba",        // mude para o nome do usuário do seu bd  
                    "masterkey");   // mude para a senha deste usuário  
        } catch (Exception e) {  
            System.out.println("Erro ao obter conexao via DriverManager: "                      
                    + e.getMessage());  
        }  
          
        // gera o relatório  
        ServletContext context = getServletContext();  
        byte[] bytes = null;  
        try {  
              
              
            // carrega os arquivos jasper  
            JasperReport relatorioJasper = (JasperReport)JRLoader.loadObject(  
                    context.getRealPath("/WEB-INF/Recibovd.jasper"));  
              
            // parâmetros, se houverem  
            Map parametros = new HashMap();  
            parametros.put("Codig", nomeS);  
              
            // direciona a saída do relatório para um stream  
            bytes = JasperRunManager.runReportToPdf(relatorioJasper,parametros,conn);  
        } catch (JRException e) {  
            e.printStackTrace();  
        }  
        if (bytes != null && bytes.length > 0) {  
            // envia o relatório em formato PDF para o browser  
            response.setContentType("application/pdf");  
              
            response.setContentLength(bytes.length);  
            ServletOutputStream ouputStream = response.getOutputStream();  
            ouputStream.write(bytes, 0, bytes.length);  
            ouputStream.flush();  
            ouputStream.close();  
        }  
          
    }  
  
    
}  

Oi, é o seguinte verifique se você está passando o caminho da pasta onde está o sub-relatório para o parâmetro ?SUBREPORT_DIR". Esse parâmetro e criado automáticamente no relatório principal que chama o sub-relatório. Exemplo: parametros.put(“SUBREPORT_DIR”, pathJava+"/");
No seu caso no trecho do código ficaria assim:

         // parâmetros, se houverem    
          Map parametros = new HashMap();    
          parametros.put("Codig", nomeS); 
         parametros.put("SUBREPORT_DIR", pathJava+"/");

Sendo que na variável pathJava você deve passar o caminho onde está o relatório, exemplo : this.javaPath = this.getServletContext().getRealPath(“WEB-INF/classes/br/com/rel/”);

Nusssa, desculpa nao entendi.

isso e no meu relatorio jasper,ou no meu servlet

No sua servilet no trecho te código de sua servilet.

// parâmetros, se houverem
Map parametros = new HashMap();
parametros.put(“Codig”, nomeS);

Acrescente a passagem do paramentro:

parametros.put(“SUBREPORT_DIR”, pathJava+"/");

Olha, acho que não estou conseguindo fazer você enteder. Coloquei uma linha de no seu código com um comentário explicativo, linha 55. Ver ai se você entende e se dar certo,
caso não de me avise.

  1. import java.io.IOException;

  2. import java.sql.Connection;

  3. import java.sql.DriverManager;

  4. import java.util.HashMap;

  5. import java.util.Map;

  6. import javax.servlet.ServletContext;

  7. import javax.servlet.ServletException;

  8. import javax.servlet.ServletInputStream;

  9. import javax.servlet.ServletOutputStream;

  10. import javax.servlet.http.HttpServlet;

  11. import javax.servlet.http.HttpServletRequest;

  12. import javax.servlet.http.HttpServletResponse;

  13. import net.sf.jasperreports.engine.JRException;

  14. import net.sf.jasperreports.engine.JasperReport;

  15. import net.sf.jasperreports.engine.JasperRunManager;

  16. import net.sf.jasperreports.engine.util.JRLoader;

  17. //import org.jfree.chart.servlet.ServletUtilities;

  18. public class Recibo2 extends HttpServlet {

  19. public void doGet(HttpServletRequest request, HttpServletResponse response)    
    
  20. throws IOException, ServletException  {    
    
  21.     //String[] vlParametro = request.getParameterValues("nome");    
    
  22.     String nomeS = request.getParameter("codig");    
    
  23.     // obtém a conexão com o banco de dados    
    
  24.     Connection conn = null;    
    
  25.     try {    
    
  26.         Class.forName("org.firebirdsql.jdbc.FBDriver");    
    
  27.         conn = DriverManager.getConnection(    
    
  28.                 "jdbc:firebirdsql:localhost/3050:C://banco//BD.FDB?defaultResultSetHoldable=True", // coloque o IP se não for usado localhost    
    
  29.                 "sysdba",        // mude para o nome do usuário do seu bd    
    
  30.                 "masterkey");   // mude para a senha deste usuário    
    
  31.     } catch (Exception e) {    
    
  32.         System.out.println("Erro ao obter conexao via DriverManager: "                        
    
  33.                 + e.getMessage());    
    
  34.     }    
    
  35.     // gera o relatório    
    
  36.     ServletContext context = getServletContext();    
    
  37.     byte[] bytes = null;    
    
  38.     try {    
    
  39.         // carrega os arquivos jasper    
    
  40.         JasperReport relatorioJasper = (JasperReport)JRLoader.loadObject(    
    
  41.                 context.getRealPath("/WEB-INF/Recibovd.jasper"));    
    
  42.         // parâmetros, se houverem    
    
  43.         Map parametros = new HashMap();    
    
  44.         parametros.put("Codig", nomeS);    
      	  
      /*Esta linha irá passar para o parametro do sub-relatório o caminho onde ele vai ler os relatórios e seus sub-relatórios.*/ 	
    
  45.         parametros.put("SUBREPORT_DIR", this.getServletContext().getRealPath+"/WEB-INF/"); 
    
  46.         // direciona a saída do relatório para um stream    
    
  47.         bytes = JasperRunManager.runReportToPdf(relatorioJasper,parametros,conn);    
    
  48.     } catch (JRException e) {    
    
  49.         e.printStackTrace();    
    
  50.     }    
    
  51.     if (bytes != null && bytes.length > 0) {    
    
  52.         // envia o relatório em formato PDF para o browser    
    
  53.         response.setContentType("application/pdf");    
    
  54.         response.setContentLength(bytes.length);    
    
  55.         ServletOutputStream ouputStream = response.getOutputStream();    
    
  56.         ouputStream.write(bytes, 0, bytes.length);    
    
  57.         ouputStream.flush();    
    
  58.         ouputStream.close();    
    
  59.     }    
    
  60. }    
    
  61. }