8
respostas

Erro ao abrir para edição do produto (javax.el.ELException: Problems calling function [spring:mvcUrl])

GRAVE: Servlet.service() for servlet [jsp] threw exception java.lang.IllegalArgumentException: Mapping not found: PC#cadastraProduto at org.springframework.web.servlet.mvc.method.annotation.MvcUriComponentsBuilder.fromMappingName(MvcUriComponentsBuilder.java:463) at org.springframework.web.servlet.mvc.method.annotation.MvcUriComponentsBuilder.fromMappingName(MvcUriComponentsBuilder.java:433)

No ProdutoController está assim:

@Transactional 
@RequestMapping(method=RequestMethod.POST,name="cadastraProduto")
public String salvar(@ModelAttribute @Valid Produto produto, BindingResult result, RedirectAttributes atts) {

        if(result.hasErrors()) {
            return form(produto);
        }

        produtoDao.insere(produto);

        return "redirect:/";
}

No .jsp está assim:

<form action="${spring:mvcUrl('PC#cadastraProduto').build()}" method="post">
8 respostas

Olá Francisco!

O problema que está dando está indicando que o Spring não achou o método "cadastraProduto" dentro da classe "ProdutoController".

Tenta mudar o nome do seu método "salvar" para "cadastraProduto", dessa forma:

...codigo omitido...

public String cadastraProduto(@ModelAttribute @Valid Produto produto, BindingResult result, RedirectAttributes atts) {

        if(result.hasErrors()) {
            return form(produto);
        }

...codigo omitido...

Veja se funciona pra ti!

Aguardo seu retorno.

Olá.

Não funcionou. Informei desse jeito:

@RequestMapping(method=RequestMethod.POST,name="cadastraProduto")
public String cadastraProduto(@ModelAttribute @Valid Produto produto, BindingResult result, RedirectAttributes atts) {

Olá Francisco!

Foi retornado um erro diferente ou foi o mesmo?

Olá.

Foi o mesmo.

GRAVE: Servlet.service() for servlet [jsp] threw exception
java.lang.IllegalArgumentException: Mapping not found: PC#cadastraProduto
    at org.springframework.web.servlet.mvc.method.annotation.MvcUriComponentsBuilder.fromMappingName(MvcUriComponentsBuilder.java:463)
    at org.springframework.web.servlet.mvc.method.annotation.MvcUriComponentsBuilder.fromMappingName(MvcUriComponentsBuilder.java:433)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)

Olá Francisco!

Acho que entendi o problema que está ocorrendo.

Geralmente quando temos um sistema em desenvolvimento o número de classes sobe exponencialmente com o passar do tempo. Isso faz com que a sigla "PC" (referencia ao ProdutoController) possa dar errado caso tenha outra classe que possui as mesmas iniciais em Camel Case, como por exemplo PessoaController.

Para evitar esse tipo de problema nós costumamos nomear as nossas actions de forma que eles se tornem únicas no sistema. Você já fez isso:

name="cadastraProduto"

Agora só precisa mudar no JSP pois, como foi dito, o name torna aquela action única e por isso não precisamos referenciar a sua classe "Pai". Para isso basta remover o PC da tag ficando assim:

action="${spring:mvcUrl('cadastraProduto').build()}"

Veja se funciona pra ti!

Aguardo seu retorno.

Olá Francisco!

Conseguiu resolver o problema?

Olá Francisco!

A resposta acima ajudou em algo? Conseguiu dar continuidade no curso?

Caso tenha tido algum problema pode me falar por aqui que posso te ajudar.

Olá.

Não consegui resolver o problema em questão.

Porém continuei o curso colocando uma URL estática no lugar, visto que o foco do curso era JPA.