Solucionado (ver solução)

Importante

Você está vendo a versão anterior da nova experiência da Alura que estamos preparando para você. Em breve, ela ganha uma identidade visual novinha totalmente pensada em potencializar seus estudos!

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