6
respostas

Nao consigo retornar uma página pelo controller

Bom estou criando um web-service em spring e quando chamo o metodo POST do meu web-service ele me retorna a string da pagina, por exemplo, index. Vou colocar o código do meu controller

package com.servidor.igor.resource;

import java.awt.font.TextAttribute;

import javax.annotation.security.PermitAll;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.DeleteMapping;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.bind.annotation.RestController;

import com.servidor.igor.model.Tabela;
import com.servidor.igor.repositorio.TabelaRep;

@RestController
@RequestMapping("/lista")
public class TabelaResource {

    @Autowired
    private TabelaRep tr;

    @GetMapping(produces="application/json")
    public @ResponseBody Iterable<Tabela> listaTabela(){
        Iterable<Tabela> listaTabela = tr.findAll();
        return listaTabela;
    }

    @PostMapping()
    @PermitAll
    public String cadastroTabela(String Descricao, String Vencimento, double Valor ) {
        Tabela tabela = new Tabela();
        tabela.setDescricao(Descricao);
        tabela.setVencimento(Vencimento);
        tabela.setValor(Valor);
        tr.save(tabela);
        return "index.html";
    }

    @DeleteMapping
    public Tabela deletaTabela(@RequestBody Tabela tabela) {
        tr.delete(tabela);
        return tabela;
    }

}
6 respostas

Oi Igor,

Como o seu Controller é um Controller Rest(@RestController), ele não vai devolver o conteúdo de uma página. Ele sempre devolve o que estiver no retorno do método.

Seu método tem o retorno do tipo String, então ele acaba devolvendo a string retornada, que no seu caso é: index.html.

Se você tem uma página html no seu projeto, chamada `index.html, e precisa que ele devolva o conteúdo dela, vai precisar ter um outro controller comum(@Controller).

Bons estudos!

Oi Rodrigo, tudo bem? Criei um @Controller para teste e recebo este erro. Estou tentando receber uma requisição post, gravar os dados em um banco de dados e em seguida redirecionar para a index.html.

Whitelabel Error Page
This application has no explicit mapping for /error, so you are seeing this as a fallback.

Thu Mar 22 12:04:48 BRT 2018
There was an unexpected error (type=Method Not Allowed, status=405).
Request method 'POST' not supported

Oi Igor,

Deu erro 405(Method not Allowed), ou seja, seu método no Controller deve estar sem a anotação @PostMapping.

Dá uma conferida.

Agora estou tendo um erro ao receber o charset. Já fiz o que me recomendaram pela internet que era setar um consumes.

Whitelabel Error Page
This application has no explicit mapping for /error, so you are seeing this as a fallback.

Thu Mar 22 13:11:35 BRT 2018
There was an unexpected error (type=Unsupported Media Type, status=415).
Content type 'application/x-www-form-urlencoded;charset=UTF-8' not supported
@ResponseStatus(HttpStatus.OK)
    @PostMapping(consumes = {"application/x-www-form-urlencoded;charset=UTF-8"})
    public String cadastroTabela(@RequestBody Tabela tabela ) {
        System.out.println(tabela.getDescricao());
        tr.save(tabela);
        return "index.html";
    }

Oi Igor,

Poste aqui o código completo do seu controller, e também da sua página html(não a index.html que você devolve, mas a que tem o formulário com as informações sendo enviadas).

Assim fica mais fácil de entender o que pode estar ocorrendo.

Controller

package com.servidor.igor.resource;


import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.HttpStatus;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.bind.annotation.ResponseStatus;

import com.servidor.igor.model.Tabela;
import com.servidor.igor.repositorio.TabelaRep;

@Controller
@RequestMapping("/lista2")
public class TabelaResource {

    @Autowired
    private TabelaRep tr;

    @RequestMapping(produces = "application/json", method = RequestMethod.GET)
    public @ResponseBody Iterable<Tabela> listaTabela() {
        Iterable<Tabela> listaTabela = tr.findAll();
        return listaTabela;
    }

    @ResponseStatus(HttpStatus.OK)
    @PostMapping(produces ="text/html",consumes = {"application/x-www-form-urlencoded;charset=UTF-8"})
    public String cadastroTabela(@RequestBody Tabela tabela ) {
        System.out.println(tabela.getDescricao());
        tr.save(tabela);
        return "index.html";
    }

    public Tabela deletaTabela(@RequestBody Tabela tabela) {
        tr.delete(tabela);
        return tabela;
    }

}

html

<!DOCTYPE html>
<html lang="en" ng-app="reg">
<head>

<meta charset="utf-8" /> 
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="ie=edge">



<title>Document</title>
<link rel="stylesheet"
    href="https://maxcdn.bootstrapcdn.com/bootstrap/4.0.0/css/bootstrap.min.css"
    integrity="sha384-Gn5384xqQ1aoWXA+058RXPxPg6fy4IWvTNh0E263XmFcJlSAwiGgFAW/dAiS6JXm"
    crossorigin="anonymous">
<link rel="stylesheet" href="lib/cssregistro.css">
<script src="lib/angular.js"></script>
<script src="lib/scriptReg.js"></script>
</head>

<body ng-controller="regContrl">
    <div ng-controller="regContrl"></div>
    <div class="controle">
        <h3>Registre suas despesas e ganhos!!!</h3>
        <hr />
        <form action="http://localhost:8080/lista2" method="POST"
            name="listaForm">
            <div class="form-group">
                <input type="text" class="form-control" name="Descricao"
                    ng-model="contato.descricao" placeholder="Entre com a descrição"
                    ng-required="true">
            </div>
            <div class="form-group">
                <input type="text" class="form-control" name="Vencimento"
                    ng-model="contato.vencimento"
                    placeholder="Entre com a Data de Vencimento" ng-required="true"
                    ng-pattern="/^(0[1-9]|[1-2][0-9]|3[0-1])\/(0[1-9]|1[0-2])\/[0-9]{4}$/">
            </div>
            <div class="form-group">
                <input type="text" class="form-control" name="Valor"
                    ng-model="contato.valor" placeholder="Entre com o valor !!!"
                    ng-required="true">
            </div>
            <hr />
            <button type="submit" class="btn btn-primary"
                onclick(window.location.href='index.html' )>Enviar</button>

        </form>
        <button class="btn btn-primary butao"
            onclick="window.location.href ='index.html'">Voltar</button>
        <div class="alert alert-danger"
            ng-show="listaForm.Descricao.$invalid && listaForm.Descricao.$dirty">
            Digite a descrição!!!</div>
        <div class="alert alert-danger"
            ng-show="listaForm.Vencimento.$invalid && listaForm.Vencimento.$dirty">
            Digite o Vencimento!!!</div>
        <div class="alert alert-danger"
            ng-show="listaForm.Valor.$invalid && listaForm.Valor.$dirty">
            Digite o Valor!!!</div>
        <div class="alert alert-danger"
            ng-show="listaForm.Vencimento.$error.pattern">Digite o ano no
            formato DD/MM/AAAA</div>
        <div class="alert alert-danger" ng-show="listaForm.Valor.$valid">Lembre-se
            de digitar os valores de dividas em valores negativos, e os valores
            de pagamentos em valores positivos</div>
    </div>


    </div>
</body>
</html>