Solucionado (ver solução)
Solucionado
(ver solução)
14
respostas

criando Relatorio com jasper pelo spring

Eu preciso criar um relatorio e estou com este codigo

Session session = manager.unwrap(Session.class);
        SessionImplementor sessionImplementor = (SessionImplementor) session;
        Connection conn = sessionImplementor.getJdbcConnectionAccess().obtainConnection();

        GeradorRelatorioUtil geradorRelatorio = new GeradorRelatorioUtil(nome+".jasper", parametros, conn);
        geradorRelatorio.geraPDParaOutputStream(new FileOutputStream(nome+".pdf"));

mas esse manager estou tentando pegar ele dentro de uma controlle

@Controller
public class RelatorioController {

    @Autowired
    private HttpServletRequest request;

    @Autowired
    private TemporaryMachineIdDao tempMachineDao;

    @PersistenceContext
    private EntityManager manager;

como posso pegar uma connection do manager, e como eu poderia fazer isso dentro de um controller? tem alguma maneira melhor? Obrigado

14 respostas

Oi Kalil, acho que não entendi muito bem. O código que vc postou acima já pega uma connection do EntityManager. Você usou o método unwrap justamente para acessar a Session do Hibernate e mandar bala.

Eu só não colocaria esse código no controller.. Criaria uma classe que tivesse um método para me retornar o OutputStream referente ao relatório e usaria ele no controller.

Para implementar o download no controller, da uma olhada nesse post => https://domineospring.wordpress.com/2015/05/25/download-de-arquivos-no-spring-mvc/

eu fiz o seguinte, retornei um bytearray. mas na chamada com ajax não sei como pegar esse bytearray.

este é o metodo que constrói o report

public byte[] geraPDParaOutputStream() throws IOException{

        ByteArrayOutputStream outputStream = new ByteArrayOutputStream();

        try {
            JasperPrint jasperPrint = JasperFillManager.fillReport(this.nomeArquivo, this.parametros, this.connection);

            JRPdfExporter exporter = new JRPdfExporter();
            exporter.setExporterInput(new SimpleExporterInput(jasperPrint));
            exporter.setExporterOutput(new SimpleOutputStreamExporterOutput(outputStream));

            SimplePdfExporterConfiguration configuration = new SimplePdfExporterConfiguration();
            exporter.setConfiguration(configuration);
            exporter.exportReport();

            outputStream.close();
            return outputStream.toByteArray();

        } catch (JRException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        return outputStream.toByteArray();

este é o controller

@Controller
public class RelatorioController {

    @Autowired
    private HttpServletRequest request;

    @Autowired
    private TemporaryMachineIdDao tempMachineDao;

    @ResponseBody
    @RequestMapping(value = "/report/relatorio", method = RequestMethod.POST, produces = MediaType.APPLICATION_JSON_VALUE)
    public void form(@RequestParam("id[]") int id[],
            @RequestParam("dateIni") @DateTimeFormat(pattern = "dd/MM/yyyy") Date dateIni,
            @RequestParam("dateFim") @DateTimeFormat(pattern = "dd/MM/yyyy") Date dateFim,
            @RequestParam("horaInit") String horaInit, @RequestParam("minutoInit") String minutoInit,
            @RequestParam("horaFim") String horaFim, @RequestParam("minutoFim") String minutoFim,
            HttpServletResponse response) throws JRException, SQLException, IOException {


        Calendar cal = Calendar.getInstance();
        Calendar calDateIni = Calendar.getInstance();
        calDateIni.setTime(dateIni);
        calDateIni.set(Calendar.HOUR_OF_DAY,Integer.valueOf(horaInit));
        calDateIni.set(Calendar.MINUTE,Integer.valueOf(minutoInit));

        Calendar calDateFim = Calendar.getInstance();
        calDateFim.setTime(dateFim);
        calDateFim.set(Calendar.HOUR_OF_DAY,Integer.valueOf(horaFim));
        calDateFim.set(Calendar.MINUTE,Integer.valueOf(minutoFim));


        Relatorio relatorio = new Relatorio();

        relatorio.setTag((int) cal.getTimeInMillis());
        relatorio.setMachinesIds(id);
        relatorio.setDateIni(calDateIni.getTime());
        relatorio.setDateFim(calDateFim.getTime());

        System.out.println(relatorio.toString());

        for (int i = 0; i < relatorio.getMachinesIds().length; i++) {
            TemporaryMachineId tempMachine = new TemporaryMachineId();

            tempMachine.setMachineId(relatorio.getMachinesIds()[i]);
            tempMachine.setTag(relatorio.getTag());

            tempMachineDao.gravar(tempMachine);
        }
        //String nome = request.getServletContext().getRealPath("/WEB-INF/jasper/reportMaquinaData");
        String nome = "c:/teste/reportMaquinaData";
        JasperCompileManager.compileReportToFile(nome+".jrxml");


        Map<String, Object> parametros = new HashMap<String, Object>();
        parametros.put("dataIni", relatorio.getDateIni());
        parametros.put("dataFim", relatorio.getDateFim());
        parametros.put("tagSrc", "1178345026");

        Connection conn = tempMachineDao.retornaCon();

        GeradorRelatorioUtil geradorRelatorio = new GeradorRelatorioUtil(nome+".jasper", parametros, conn);
        byte [] data = geradorRelatorio.geraPDParaOutputStream();

        streamReport(response, data, "report.pdf");

    }
    protected void streamReport(HttpServletResponse response, byte[] data, String name)
            throws IOException {

        response.setContentType("application/pdf");
        response.setHeader("Content-disposition", "attachment; filename=" + name);
        response.setContentLength(data.length);

        response.getOutputStream().write(data);
        response.getOutputStream().flush();
    }
}

chamada ajax.

$('#criaRelatorio').click(
                    function() {
                        var dataIni = $('#dateIni').val();
                        var objDateIni = new Date();
                        objDateIni.setYear(dataIni.split("/")[2]);
                        objDateIni.setMonth(dataIni.split("/")[1]);
                        objDateIni.setDate(dataIni.split("/")[0]);

                        var dateFim = $('#dateFim').val();
                        var objDateFim = new Date();
                        objDateFim.setYear(dateFim.split("/")[2]);
                        objDateFim.setMonth(dateFim.split("/")[1]);
                        objDateFim.setDate(dateFim.split("/")[0]);

                        if (objDateIni.getTime() > objDateFim.getTime()) {
                            alert('dataIni menor que data Fim');
                        }
                        if (objDateIni.getTime() == objDateFim.getTime()) {
                            var horaInit = $('#horaInit option:selected')
                                    .text()
                                    + $('#minutoInit option:selected').text();
                            var horaFim = $('#horaFim option:selected').text()
                                    + $('#minutoFim option:selected').text();

                            if (horaInit > horaFim) {
                                alert('horaIni maior que horaFim');
                            }

                        } else {
                            var ids = [];

                            $(':checkbox:checked').each(function(i) {
                                ids[i] = $(this).val();
                            });
                            if (ids == 0) {
                                alert("selecione alguma maquina");
                            } else {

                                var horaInit = $('#horaInit option:selected').val();
                                var minutoInit = $('#minutoInit option:selected').val();
                                var horaFim = $('#horaFim option:selected').val();
                                var minutoFim = $('#minutoFim option:selected').val();
                                var dateFim = $('#dateFim').val();
                                var dateIni = $('#dateIni').val();
                                $.ajax({
                                    url : 'report/relatorio',
                                    method : 'POST',
                                    data : {
                                        id : ids,
                                        dateIni:dateIni,
                                        dateFim:dateFim,
                                        horaInit:horaInit,
                                        minutoInit:minutoInit,
                                        horaFim:horaFim,
                                        minutoFim:minutoFim
                                    },
                                    success : function() {

                                    }
                                });
                            }

                        }

                    });

como devo proceder?

Opa, não vai rolar vc fazer o download via ajax. O melhor é você deixar o formulário normal e aí, quando o usuário clicar, o download vai ser realizado.

mas como vou poder enviar essas informações sem ajax?

do jeito que esta será que ja é efetuado o download?

O código do seu controller, por mais que esteja bem mais complexo do que o do post que te passei, parece que funciona. Em relação ao ajax, é só vc enviar os dados do formulário da maneira tradicional, sem ajax.

mas la tem vários ids, como vou falar pro controller qual a lista de ids?

ex.

<tr>
                        <td><input type="checkbox" id="2" class="filled-in"
                            value="45" /> <label for="2"></label></td>
                        <td><a name="machineId" value="45">45</a></td>
                        <td>Game</td>
                        <td>Status</td>
                        <td>Math Model</td>
                        <td>Last Update</td>
                    </tr>
<tr>
                        <td><input type="checkbox" id="2" class="filled-in"
                            value="45" /> <label for="2"></label></td>
                        <td><a name="machineId" value="45">45</a></td>
                        <td>Game</td>
                        <td>Status</td>
                        <td>Math Model</td>
                        <td>Last Update</td>
                    </tr>

usei ajax, para sair varrendo todos os ids com js. e junta-los em um json. para poder enviar pro controller

Kalil, isso é padrão dos formulários.. .Ele só vai mandar os ids do checkboxes que estão selecionados.. Como todos inputs tem o mesmo name , vai chegar no método do controller um Integer[] como argumento.. nesse array vão ter os ids que o usuário selecionou.

então fiz um trabalho atoa rs. vou testar isso

deu 404

erro.

HTTP Status 400 - Required int[] parameter 'machineId[]' is not present

jsp

<%@ page language="java" contentType="text/html; charset=ISO-8859-1"
    pageEncoding="ISO-8859-1"%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>
<%@ taglib uri="http://www.springframework.org/tags/form" prefix="form"%>
<%@ taglib uri="http://www.springframework.org/tags" prefix="s"%>


<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<!--Import Google Icon Font-->
<c:url value="/resources/css" var="cssPath" />
<c:url value="/resources/js" var="jsPath" />
<!--Import materialize.css-->
<link rel="stylesheet" href="${cssPath}/materialize.min.css" />
<link rel="stylesheet" href="${cssPath}/pos.css" />

<!--Let browser know website is optimized for mobile-->
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
</head>

<body>
    <form action="report/relatorio" method="POST">
        <div class="col s12">
            <div class="centralizado">
                <p>
                    <input name="group1" type="radio" id="terminalsOnline7Days" checked />
                    <label for="terminalsOnline7Days">Terminals online at least
                        once on last 7 days</label> <input name="group1" type="radio"
                        id="terminalsOnline" /> <label for="terminalsOnline">Online
                        terminals</label> <input name="group1" type="radio" id="allTerminals" />
                    <label for="allTerminals">All terminals</label>
                </p>
            </div>

            <table class="striped">
                <thead>
                    <tr>
                        <th><input type="checkbox" id="checkAll" class="filled-in"
                            id="checkAll" /> <label for="checkAll"></label></th>
                        <th>Terminal ID</th>
                        <th>Status</th>
                        <th>Math Model</th>
                        <th>Last Update</th>
                        <th>Current Profit</th>
                    </tr>
                </thead>
                <tbody>
                    <tr>

                        <td><input type="checkbox" id="1" class="filled-in"
                            value="44" /> <label for="1"></label></td>
                        <td><a name="machineId" value="44">44</a></td>
                        <td>Game</td>
                        <td>Status</td>
                        <td>Math Model</td>
                        <td>${machine.machineId }</td>
                    </tr>

                    <tr>
                        <td><input type="checkbox" id="2" class="filled-in"
                            value="45" /> <label for="2"></label></td>
                        <td><a name="machineId" value="45">45</a></td>
                        <td>Game</td>
                        <td>Status</td>
                        <td>Math Model</td>
                        <td>Last Update</td>
                    </tr>

                </tbody>
            </table>

            <div class="row col s12 centralizado">
                <div class="row">
                    <div class="row col s3">Date Ini</div>
                    <div class="row col s3">Date Fim</div>
                </div>
                <div class="row">
                    <div class="row col s3">
                        <input id="dateIni" type="date" class="datepicker col s12">
                    </div>
                    <div class="row col s3">
                        <input id="dateFim" type="date" class="datepicker col s12">
                    </div>
                </div>
                <div class="row">
                    <div class="row col s1">
                        <div class="col s12" id="horaInit">
                            <select>
                                <option value="00">00</option>
                                <option value="01">01</option>
                                <option value="02">02</option>
                                <option value="03">03</option>
                                <option value="04">04</option>
                                <option value="05">05</option>
                                <option value="06">06</option>
                                <option value="07">07</option>
                                <option value="08">08</option>
                                <option value="09">09</option>
                                <option value="10">10</option>
                                <option value="11">11</option>
                                <option value="12">12</option>

                                <option value="13">13</option>
                                <option value="14">14</option>
                                <option value="15">15</option>
                                <option value="16">16</option>
                                <option value="17">17</option>
                                <option value="18">18</option>
                                <option value="19">19</option>
                                <option value="20">20</option>
                                <option value="21">21</option>
                                <option value="22">22</option>
                                <option value="23">23</option>
                            </select>
                        </div>
                    </div>

                    <div class="row col s1">
                        <div class="col s12" id="minutoInit">
                            <select>
                                <option value="00">00</option>
                                <option value="10">10</option>
                                <option value="20">20</option>
                                <option value="30">30</option>
                                <option value="40">40</option>
                                <option value="50">50</option>
                                <option value="59">59</option>
                            </select>
                        </div>
                    </div>

                    <div class="row col s1"></div>

                    <div class="row col s1">
                        <div class="col s12" id="horaFim">
                            <select>
                                <option value="00">00</option>
                                <option value="01">01</option>
                                <option value="02">02</option>
                                <option value="03">03</option>
                                <option value="04">04</option>
                                <option value="05">05</option>
                                <option value="06">06</option>
                                <option value="07">07</option>
                                <option value="08">08</option>
                                <option value="09">09</option>
                                <option value="10">10</option>
                                <option value="11">11</option>
                                <option value="12">12</option>

                                <option value="13">13</option>
                                <option value="14">14</option>
                                <option value="15">15</option>
                                <option value="16">16</option>
                                <option value="17">17</option>
                                <option value="18">18</option>
                                <option value="19">19</option>
                                <option value="20">20</option>
                                <option value="21">21</option>
                                <option value="22">22</option>
                                <option value="23" selected>23</option>
                            </select>
                        </div>
                    </div>

                    <div class="row col s1">
                        <div class="col s12" id="minutoFim">
                            <select>
                                <option value="00">00</option>
                                <option value="10">10</option>
                                <option value="20">20</option>
                                <option value="30">30</option>
                                <option value="40">40</option>
                                <option value="50">50</option>
                                <option value="59" selected>59</option>
                            </select>
                        </div>
                    </div>

                </div>



            </div>

            <div class="row col s12 centralizado">
                <button type="submit" value="Submit">Submit</button>
            </div>
        </div>
    </form>
    <script type="text/javascript" src="${jsPath}/jquery-2.1.1.min.js"></script>
    <script type="text/javascript" src="${jsPath}/materialize.min.js"></script>
    <script type="text/javascript" src="${jsPath}/pos.js"></script>
</body>
</html>

na controller eu alterei para

@ResponseBody
    @RequestMapping(value = "/report/relatorio", method = RequestMethod.POST, produces = MediaType.APPLICATION_JSON_VALUE)
    public void form(@RequestParam("machineId[]") int id[],

mesmo assim continuou o 404.

Você colocou os names nos links() e não nos inputs.

verdade!

mas mesmo assim não funciona. mudei para dentro do input e mesmo assim acusa que não tem.

<input type="checkbox" id="1" class="filled-in"
                            value="44"name="machineId" /> <label for="1"></label></td>
solução!
HTTP Status 400 - Required int[] parameter 'machineId[]' is not present

Coloca name="machineId[]"

muito obrigado. agora rodou tudo, envia os dados, faz o relatorio, recebe o pdf. Vlw mesmo

Quer mergulhar em tecnologia e aprendizagem?

Receba a newsletter que o nosso CEO escreve pessoalmente, com insights do mercado de trabalho, ciência e desenvolvimento de software