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

Erro ao criar o método “findByStatus”

Realizei os mesmo passos da aula, porém ao criar o método findByStatus ocorre o erro ao rodar a aplicação.

Error starting ApplicationContext. To display the conditions report re-run your application with 'debug' enabled. 2021-03-01 21:20:43.517 ERROR 8184 --- [ restartedMain] o.s.boot.SpringApplication : Application run failed

org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'pedidoRepository': FactoryBean threw exception on object creation; nested exception is java.lang.IllegalArgumentException: Failed to create query for method public abstract java.util.List br.com.alura.mvc.mudi.repository.PedidoRepository.findByStatus(br.com.alura.mvc.mudi.model.StatusPedido)! Unable to locate Attribute with the the given name [status] on this ManagedType [br.com.alura.mvc.mudi.model.Pedido]

4 respostas
package br.com.alura.mvc.mudi.repository;

import java.util.List;

import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.stereotype.Repository;

import br.com.alura.mvc.mudi.model.Pedido;
import br.com.alura.mvc.mudi.model.StatusPedido;

@Repository
public interface PedidoRepository extends JpaRepository<Pedido, Long> {

    List<Pedido> findByStatus(StatusPedido status);

}

Deixei propositalmente o argumento com o status "AGUARDANDO" conforme visto em aula. A partir deste ponto tive o problema.

package br.com.alura.mvc.mudi.controller;

import java.util.List;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;

import br.com.alura.mvc.mudi.model.Pedido;
import br.com.alura.mvc.mudi.model.StatusPedido;
import br.com.alura.mvc.mudi.repository.PedidoRepository;

@Controller
@RequestMapping("/home")
public class HomeController {

    @Autowired
    private PedidoRepository pedidoRepository;

    @GetMapping
    public String home(Model model) {        
        List<Pedido> pedidos = pedidoRepository.findAll();
        model.addAttribute("pedidos", pedidos);    
        return "home";
    }

    @GetMapping("/aguardando")
    public String aguardando(Model model) {    
        List<Pedido> pedidos = pedidoRepository.findByStatus(StatusPedido.AGUARDANDO);
        model.addAttribute("pedidos", pedidos);    
        return "home";
    }

}
package br.com.alura.mvc.mudi.controller;

import java.util.List;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;

import br.com.alura.mvc.mudi.model.Pedido;
import br.com.alura.mvc.mudi.model.StatusPedido;
import br.com.alura.mvc.mudi.repository.PedidoRepository;

@Controller
@RequestMapping("/home")
public class HomeController {

    @Autowired
    private PedidoRepository repository;

    @GetMapping()
    public String home(Model model) {
        List<Pedido> pedidos = repository.findAll();
        model.addAttribute("pedidos", pedidos);
        return "home"; 
    }

    @GetMapping("/{status}")
    public String porStatus(@PathVariable("status") String status, Model model) {
        List<Pedido> pedidos = repository.findByStatus(StatusPedido.valueOf(status.toUpperCase()));
        model.addAttribute("pedidos", pedidos);
        model.addAttribute("status", status);
        return "home"; 
    }

    @ExceptionHandler(IllegalArgumentException.class)
    public String onError() {
        return "redirect:/home";
    }
}

Tente copiar esse código no seu HomeController para ver se funciona, pois não consegui achar algum erro no seu código.

solução!

Por algum motivo que não me lembro, talvez a fata de experiência com java, em meu "model" o meu status estava declarado como "Status" sendo correto "status".