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

Pegar parâmetro Post e usar em outro método

Boa noite

Estou fazendo o treinamento criando um outro sistema, e me apareceu um problema.

No meu sistema, preciso enviar à uma API um JSON com dois parâmetros, e receber como resposta um array de dados Json.

O meu teste roda normalmente assim:

public class TestaSimulacao {

    public static void main(String[] args) throws IOException, InterruptedException {

        List<SimulacaoConsignacao> consignacoes = new ArrayList<>();

        Gson gson = new Gson();
        ParametrosEntrada parametros = new ParametrosEntrada(10000,12);


          String jsonEntrada = gson.toJson(parametros);
          System.out.println("Json de Parametro:" + jsonEntrada);

        ApiResponse factory = new ApiResponse();
        factory.montaResumo(jsonEntrada, consignacoes);

        for (SimulacaoConsignacao simulacao : consignacoes) {
            System.out.println("Array Resumido: " +simulacao);
        }
    }

Json que envio no post: {"valor":10000.0,"meses":12}

Agora, não consigo fazer o que o usuário digita em uma página html chegar ao outro método que montaria esse json de envio para receber o array de resposta:


@Controller //Spring identifica que se trata de um controlador
@RequestMapping("/consignacao/simulacao") // dominio (consignacao / + requisições)
public class ConsignacaoController {

    private List<ParametrosEntrada> parametrosarray = new ArrayList<>();
    Gson gson = new Gson();
    @Autowired
    ParametroRepository parametroRepository;


    //controlador do cadastra ***********************************
   @GetMapping("/cadastra")
    public String carregaCadastro(){
            //pegar os dados digitados nessa página
       return "consignacao/simulacao/resultado_simulacao";
    }

    @PostMapping("/cadastra")
    public String pegaParametros(ParametrosEntrada parametro, Model model) throws IOException, InterruptedException {
        parametroRepository.save(parametro);
        return carregaResultadoSimulacao(model);
    }

    @GetMapping("/resultado") //qdo req tipo get mapeia url
    public String carregaResultadoSimulacao (Model model) throws IOException, InterruptedException {
        // pegar o conteudo digitado aqui para montar o Json de requisição, receber a resposta e montar a lista

        List<SimulacaoConsignacao> consignacoes = new ArrayList<>();
        String jsonEntrada = gson.toJson(???);
        System.out.println(jsonEntrada);
        System.out.println("Json: "+ jsonEntrada);
        ApiResponse factory = new ApiResponse();
        factory.montaResumo(jsonEntrada, consignacoes);

        model.addAttribute("resumido",consignacoes);
        return "consignacao/simulacao/resultado_simulacao"; //caminho da pasta templates
    }
}

Como posso proceder?

Obrigado!

4 respostas

Oi Flávio!

Se entendi corretamente, você quer pegar as informações (valor e meses) que vai adicionar ao json via formulário da aplicação, certo?

Você precisa ter a página do formulário com os campos, igual mostramos no curso:

<div>
    <label for="valor">Valor:</label>
    <input id="valor" name="valor">
</div>

<div>
    <label for="meses">Meses:</label>
    <input id="meses" name="meses">
</div>

E no código da classe Controller que você mandou vi que já tem o método que recebe os dados desse formulário:

@PostMapping("/cadastra")
public String pegaParametros(ParametrosEntrada parametro, Model model) throws IOException, InterruptedException {
    parametroRepository.save(parametro);
    return carregaResultadoSimulacao(model);
}

É nesse método que você deveria colocar a lógica para enviar os parâmetros para a API, mas você colocou a lógica no método carregaResultadoSimulacao do Controller.

Obrigado pela resposta professor!

Passando para o post, agora minha página não recebe os dados pelo Thymeleaf:

public class ConsignacaoController {

    private List<SimulacaoConsignacao> resumidos = new ArrayList<>();
    Gson gson = new Gson();

    //controlador do cadastra ***********************************
   @GetMapping("/cadastra")
    public String carregaCadastro(){
       return "consignacao/simulacao/cadastra_simulacao";
    }

    @PostMapping("/cadastra")
    public String pegaParametros(ParametrosEntrada parametro, Model model) throws IOException, InterruptedException {
        Gson gson = new Gson();
        String jsonEntrada = gson.toJson(parametro);
        ApiResponse factory = new ApiResponse();
        factory.montaResumo(jsonEntrada, resumidos);

        for (SimulacaoConsignacao simulacao : resumidos) {
            System.out.println("Array Resumido: " + simulacao);
        }
        model.addAttribute("simulacao",resumidos);
        return "redirect:/consignacao/simulacao/resultado";
    }

    @GetMapping("/resultado") //qdo req tipo get mapeia url
    public String carregaResultadoSimulacao (Model model)  {
        model.addAttribute("simulacao",resumidos);
        for (SimulacaoConsignacao resumido : resumidos) {
            System.out.println("chegou no resultado: " + resumido);
        }

página:

<!DOCTYPE html>
<html lang="pt-br"
      xmlns:th = "http://thymeleaf.org"
      xmlns:layout="http://www.ultraq.net.nz/thymeleaf/layout"
      layout:decorate="~{template.html}">

    <head>
        <title>Resultado da Simulação</title>
    </head>

    <body>
        <div layout:fragment="conteudo">
            <h1>Veja as opções disponíveis </h1>
            <table>
                <thead>
                <tr>
                    <th>Tipo</th>
                    <th>Descrição</th>
                    <th>Taxa de Juros</th>
                    <th>Primeira Parcela</th>
                    <th>Ultima Parcela</th>
                </tr>
                </thead>
                <tbody>
                    <tr th:each="simulacao : ${resumidos}">
                        <td th:text="${simulacao.tipo}"></td>
                        <td th:text="${simulacao.descricao}"></td>
                        <td th:text="${simulacao.taxaJuros}"></td>
                        <td th:text="${simulacao.valorPrestacao}"></td>
                        <td th:text="${simulacao.valorPrestacao}"></td>
                    </tr>
                </tbody>
            </table>
        </div>
    </body>
</html>

O println pegou os dados, apenas não carregou no html. O que pode estar errado?

Flávio

solução!

Você adicionou no model com o nome simulacao:

model.addAttribute("simulacao"

Mas na página html está utilizando o nome resumidos:

<tr th:each="simulacao : ${resumidos}">

Excelente professor, obrigado pela atenção!