8
respostas

Acessando em um método duas variáveis de outro método passado como parâmetro de uma url!

Como acessar em um método apenas duas variáveis de um método passado como parâmetro de uma url...

@RequestMapping(value = "/datas/{mes}/{ano}", method = RequestMethod.GET, produces = "application/json")
    public @ResponseBody void filtroMesAno(HttpServletResponse response, HttpServletRequest request,
            @PathVariable("mes") String mes, @PathVariable("ano") String ano) throws Throwable{

        String dataAntUrl = "", dataAtuUrl = "", dataPosUrl = "";

        // Essas duas variáveis devo enviar para outro método
        String getMes = mes;
        String getAno = ano;

        YearMonth getDataUrl = YearMonth.parse(mes + "/" + ano, formataDataUrl);

        dataAntUrl = getDataUrl.minusMonths(1).format(formataDataUrl);
        dataAtuUrl = getDataUrl.format(formataDataUrl);
        dataPosUrl = getDataUrl.plusMonths(1).format(formataDataUrl);

        JSONObject obj = new JSONObject();

        try {
            obj.put("dataAntUrl", dataAntUrl);
            obj.put("dataAtuUrl", dataAtuUrl);
            obj.put("dataPosUrl", dataPosUrl);
        } catch (JSONException e) {
            e.printStackTrace();
        }

        String jsonString = obj.toString();

        try {
            response.getWriter().print(jsonString);
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
@RequestMapping(value = "listJson", method = RequestMethod.GET, produces = "application/json")
    public @ResponseBody void doPost(HttpServletRequest request, HttpServletResponse response) throws Throwable {

        // Supostamente devo receber duas variáveis do tipo String que vem de outro método
        String mes = "02", ano = "2017";

        List<MinhasReceitas> listMinhasReceitas = receitasService.buscarPorAno(mes, ano);

        ObjectWriter objW = new ObjectMapper().writer().withDefaultPrettyPrinter();

        DataTableMinhasReceitas dataTableMinhasReceitas = new DataTableMinhasReceitas();

        dataTableMinhasReceitas.setData(listMinhasReceitas);

        String json = objW.writeValueAsString(dataTableMinhasReceitas).toString();

        response.getWriter().print(json);

        System.out.println("Lista retornada com todos os itens: " + json);
    }
8 respostas

Não entendi muito bem sua dúvida, pode tentar me explicar melhor para eu te ajudar ?

Olá Matheus. Em um método

filtroMesAno(HttpServletResponse response, HttpServletRequest request,
            @PathVariable("mes") String mes, @PathVariable("ano") String ano)

recebo os parâmetros que trata um data específica e a envia um json de volta.

doPost(HttpServletRequest request, HttpServletResponse response)

nesse outro método estou tentando acessar o método que recebe a data, assim:

filtroMesAno(null, null, mes, ano);

e não estou conseguindo pois um erro sugere o tratamento da data que o método já faz.

filtroMesAno(request, response, mes, ano);

quando tempo passar com os parâmetros corretamente ele envia o json com os dados dos dois métodos, o que não preciso e se torna desnecessário.

Só quero acessar essas duas variáveis que ja vem populadas do outro método que por sua vez, pega os valores que vem da url.

Clerman, vamos lá, como você está usando o Spring, tem algumas coisas que acredito que você possa deixar de fazer para melhorar a legibilidade do seu código.

Primeiro é não manipular mais esse dois objetos HttpServletRequest request, HttpServletResponse response

Não tem necessidade, o Spring já encapsula isso para gente.

Outra coisa, que pode te ajudar para caramba é que você não precisa escrever o json na mão, o próprio Spring por padrão já usa por trás dos panos o Jackson que converte um objeto para json e vice versa.

O que você pode fazer é o seguinte :

@RequestMapping
public List<Obj> recebe(){

    // regra de négocio

    return suaLista;
}

Ainda não entendi a necessidade de passar por dois métodos no controller.

Ainda não ficou muito claro para mim isso.

Muito boa as dicas, vou acatar. Essa data que pego em um método e retorna o json é responsável por uma tratamento. Pegar essa data que é enviada de uma url desse método e passar para outro método para fazer outro tratamento em tempo de execução. Ou seja, aproveitar essa data em dois métodos diferentes.

Mas você quer fazer duas requisição realmente ?

Você pode chamar simplesmente um método da sua classe dentro do seu controller.

Algo parecido com isso :

@Controller
class Controlador {

    private Retorno metodoDaClasse(){
        // regra de negocio
        return seuRetorno;
    }

    @RequestMapping
    public OutroRetorno recebeRequisicao(){

        Retorno retorno = metodoDaClasse();

        return retorno.criaOutroRetorno();

    }

}

Ficou bem vago meu exemplo, mas acredito que você possa conseguir usar essa minha abstração no seu caso.

O problema é que ao utilizar o retorno, esse retorno me traz todos os dados de dentro desse método, enquanto eu só preciso da data, seria algo do tipo

retorno(mes, ano);

e, é aí que estou tendo problemas pois esse método recebe essa data e faz o tratamento dela...

Seu método do Post quem vai fazer a resposta né ?

O que pode fazer é o seguinte :


@RequestMapping(value = "/datas/{mes}/{ano}", method = RequestMethod.GET, produces = "application/json")
    public List< MinhasReceitas > filtroMesAno(@PathVariable("mes") String mes, @PathVariable("ano") String ano) {

        String getMes = mes;
        String getAno = ano;

        return doPost(mes, ano);

    }

    private List<MinhasReceitas) doPost(String mes, String ano){
        return receitasService.buscarPorAno(mes, ano);

    }

Ficou mais claro ?

Lógico que tem que ver exatamente se sua regra de negócio permite fazer isso e também fazer uma refatoração nesse seu código.

Como pode atribuir um retorno de um tipo para um método que pede como retorno uma lista? Não entendo isso! Não funciona isso que me passou!

vou te passar meus dois métodos!

Esse primeiro método recebe a data faz o tratamento e envia o json, preciso melhorar, mas como esta funciona, vou melhora ele após resolver essa questão! s

// Recebe mes e ano para o find e envia o json da data
    @RequestMapping(value = "/datas/{mes}/{ano}", method = RequestMethod.GET, produces = "application/json")
    public @ResponseBody void filtroMesAno(HttpServletResponse response, HttpServletRequest request,
            @PathVariable("mes") String mes, @PathVariable("ano") String ano) throws Throwable {

        String dataAntUrl = "", dataAtuUrl = "", dataPosUrl = "";

        AtualizaMesAno atualizaMesAno = new AtualizaMesAno();

        Long getId = (long) 1;

        atualizaMesAno.setMes(mes);
        atualizaMesAno.setAno(ano);
        atualizaMesAno.setId(getId);

        System.out.println("================= Mes: " + mes + " Ano: " + ano + " ID: " + getId);

        mesAnoService.saveOrUpdate(atualizaMesAno);

        YearMonth getDataUrl = YearMonth.parse(mes + "/" + ano, formataDataUrl);

        dataAntUrl = getDataUrl.minusMonths(1).format(formataDataUrl);
        dataAtuUrl = getDataUrl.format(formataDataUrl);
        dataPosUrl = getDataUrl.plusMonths(1).format(formataDataUrl);

        JSONObject obj = new JSONObject();

        try {
            obj.put("dataAntUrl", dataAntUrl);
            obj.put("dataAtuUrl", dataAtuUrl);
            obj.put("dataPosUrl", dataPosUrl);
        } catch (JSONException e) {
            e.printStackTrace();
        }

        String jsonString = obj.toString();

        try {
            response.getWriter().print(jsonString);
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

É nesse outro que preciso receber a data, que por enquanto esto recebendo via banco de dados, mas precisa pega-la em tempo de execução:

@RequestMapping(value = "listJson", method = RequestMethod.GET, produces = "application/json")
    public @ResponseBody void doPost(HttpServletRequest request, HttpServletResponse response) throws Throwable {

        List<AtualizaMesAno> atualizaMesAno = mesAnoService.findAll();

        for(AtualizaMesAno mesAno : atualizaMesAno){

            mes = mesAno.getMes();
            ano = mesAno.getAno();
            Long id = mesAno.getId().lowestOneBit(1);

        }*

        System.out.println("============= " + mes + " = " +  ano);

        List<MinhasReceitas> listMinhasReceitas = receitasService.buscarPorAno(mes, ano);

        ObjectWriter objW = new ObjectMapper().writer().withDefaultPrettyPrinter();

        DataTableMinhasReceitas dataTableMinhasReceitas = new DataTableMinhasReceitas();

        dataTableMinhasReceitas.setData(listMinhasReceitas);

        String json = objW.writeValueAsString(dataTableMinhasReceitas).toString();

        System.out.println("============= " + mes + " = " +  ano);

        response.getWriter().print(json);

        System.out.println("Lista retornada com todos os itens: " + json);
    }