7
respostas

Deletar - This application has no explicit mapping

Criei o metodo deletar conforme apresentado no curso, porém ao executar o botão deletar, não encontra meu método.

// html
<tr th:each="convidado : ${convidados}">
                    <td><span th:text="${convidado.nome}"></span></td>
                    <td><span th:text="${convidado.email}"></span></td>
                    <td><span th:text="${convidado.telefone}"></span></td>
                    <td><span><a th:href="@{'/deletar/' + ${convidado.id}}">
                        <button type="button" class="btn btn-success">Deletar</button></a></span></td>
                </tr>

// convidadoController
@RequestMapping(value = "deletar", method = RequestMethod.POST)
    public String deletar(@RequestBody Long convidado) {
        service.deletar(convidado);

        return "listaconvidados";
        // return convidado;
    }

// service
public void deletar (Long convidado) {
        repository.deleteById(convidado);
    }
7 respostas

Oi Francisco, tudo bem?

Certifique-se de que sua classe principal esteja em um pacote raiz acima das outras classes.

Quando você executa um Spring Boot Application, (isto é, uma classe anotada com @SpringBootApplication), o Spring irá apenas varrer as classes abaixo do pacote da sua classe principal.

Ela funciona normalmente, busca todos os convidados, conforme o exemplo do curso, porém ao implementar o método deletar, acontece essa mensagem. Já pesquisei varias formas porém sem Sucesso, coloquei o breakpoint no metado ele nem para, então acredito que seja a forma de como ele é acionado no html

Tem mais detalhes no stack além dessa mensagem "This application has no explicit mapping"?

Na tentativa mostrada acima o único retorno que tenho no browser:

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

Thu Feb 21 19:38:34 BRT 2019
There was an unexpected error (type=Not Found, status=404).
No message available

Agora uma nova tentativa de outra forma que encontrei na web

//convidadoController
@DeleteMapping ("/deletar/{id}")
    public void deletar(@PathVariable(value = "id") long convidado) {
        service.deletar(convidado);
    }

Error retornado no browser:

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

Thu Feb 21 19:40:43 BRT 2019
There was an unexpected error (type=Method Not Allowed, status=405).
Request method 'GET' not supported
org.springframework.web.HttpRequestMethodNotSupportedException: Request method 'GET' not supported
    at org.springframework.web.servlet.mvc.method.RequestMappingInfoHandlerMapping.handleNoMatch(RequestMappingInfoHandlerMapping.java:200)
    at org.springframework.web.servlet.handler.AbstractHandlerMethodMapping.lookupHandlerMethod(AbstractHandlerMethodMapping.java:419)
    at org.springframework.web.servlet.handler.AbstractHandlerMethodMapping.getHandlerInternal(AbstractHandlerMethodMapping.java:365)
    at org.springframework.web.servlet.handler.AbstractHandlerMethodMapping.getHandlerInternal(AbstractHandlerMethodMapping.java:65)
    at org.springframework.web.servlet.handler.AbstractHandlerMapping.getHandler(AbstractHandlerMapping.java:401)

//Declaração da minha classe...

@Controller
public class ConvidadoController {
 // metados
}

Quando eu clico no link criado no meu html para chamar o deletar este e o recurso passado pelo browser

http://localhost:9000/deletar/18

Refiz todo o projeto usando o spring initializr acredito que problemas com jar não possa ser.

tenta colocar

<form action="/deletar/${convidado.id}" method="post">
    <button type="submit" class="btn btn-success">Deletar</button>
</form>

E o @DeleteMapping deixa @PostMapping mesmo

Não funcionou.

<tr th:each="convidado : ${convidados}">
                    <td><span th:text="${convidado.nome}"></span></td>
                    <td><span th:text="${convidado.email}"></span></td>
                    <td><span th:text="${convidado.telefone}"></span></td>
                    <!-- <td><span><a th:href="@{'/deletar/' + ${convidado.id}}"> -->
                    <!-- <button type="button" class="btn btn-success">Deletar</button></a></span></td> -->
                    <td><form action="/deletar/${convidado.id}" method="post">
                            <button type="button" class="btn btn-success">Deletar</button>
                        </form></td>
                </tr>

E nessa forma também não

        <tr th:each="convidado : ${convidados}">
                    <td><span th:text="${convidado.nome}"></span></td>
                    <td><span th:text="${convidado.email}"></span></td>
                    <td><span th:text="${convidado.telefone}"></span></td>
                    <!-- <td><span><a th:href="@{'/deletar/' + ${convidado.id}}"> -->
                    <!-- <button type="button" class="btn btn-success">Deletar</button></a></span></td> -->
                    <td><form action="@{'/deletar/' + ${convidado.id}}"    method="post">
                            <button type="button" class="btn btn-success">Deletar</button>
                        </form></td>
                </tr>

Ambas não aciona o métado.

Senhores, dando continuidade ao tema. Cheguei encontrar a solução porém não como eu quero ou deveria ser.

Solução 1

<tr th:each="convidado : ${convidados}">
                    <td><span th:text="${convidado.nome}"></span></td>
                    <td><span th:text="${convidado.email}"></span></td>
                    <td><span th:text="${convidado.telefone}"></span></td>
                    <td>
                        <form th:action="@{/deletar/{id}(id=${convidado.id})}" method="post">
                            <button type="submit" class="btn btn-success">Deletar</button>
                        </form>
                    </td>

Solução 2

                    <td>
                        <span>
                            <a th:href="@{/deletar/{id}(id=${convidado.id})}">
                                <button type="submit" class="btn btn-success">Deletar</button>
                            </a>
                        </span>
                    </td>
                </tr>

Porém, quando deletado o item, a URL fica da seguinte forma:

http://localhost:9000/deletar/27

Que por sinal o meu boostrap nao funciona quando retorna para a pagina de listaConvidados.

// Meu controller

@PostMapping("/deletar/{id}")
    public String deletar(@PathVariable(value = "id") Long convidado, Model model) {

        service.deletar(convidado);
        return listaConvidados(model);

    }
// Metodo que retorna todos os convidados.

@RequestMapping("listaconvidados")
    public String listaConvidados(Model model){

        Iterable<Convidado> convidados = service.obterTodos();

        model.addAttribute("convidados", convidados);

        return "listaconvidados";
    }

Vale lembrar que, quando ele vem do /index ele carrega o bootstrap, quando eu pesquiso:

http://localhost:9000/listaconvidados

Boostrap funciona.

Quando tento

return "redirect:listaConvidados";

a minha URL fica :

http://localhost:9000/deletar/listaconvidados

Vou deixar o tópico aberto ...