0
votes

When I run and press button "Delete" the page show me this error:

Unable to find matching navigation case with from-view-id '/ApagarCategoria.xhtml' for action '#{registarVendedor.deleteCtg(c)}' with outcome '[entities.Categorias[ categoria=Carro ]]'

Controller

In RegistoVendedor.java the function is public List< Categorias> deleteCtg(Categorias ct)

package Controller;


public class RegistoVendedor {

@EJB
RegistoBean registarVendedor;

String contacto;
String password;

Categorias categoria = new Categorias();


List<Categorias> categoriasList = new ArrayList<>();

public List<Categorias> getCategoriasList() {
    return categoriasList;
}

public void setCategoriasList(List<Categorias> categoriasList) {
    this.categoriasList = categoriasList;
}

public List<Categorias> deleteCtg(Categorias ct) {        
    categoriasList = registarVendedor.removeCtg(ct);
    return categoriasList;
} 
}

In RegistoBean.java the function is public List< Categorias> removeCtg(Categorias ct)

@Stateless
public class RegistoBean {

@PersistenceContext
EntityManager em;

public List<Categorias> removeCtg(Categorias ct){
    em.createNamedQuery("Categorias.removeCategoria");
    return getCtg();
}

public List<Categorias> getCtg(){
    return (List<Categorias>) em.createNamedQuery("Categorias.findAll").getResultList();
}
}

Categorias.java database

@Entity
@Table(name = "CATEGORIAS")
@XmlRootElement
@NamedQueries({
@NamedQuery(name = "Categorias.findAll", query = "SELECT c FROM Categorias c")
, @NamedQuery(name = "Categorias.findByCategoria", query = "SELECT c FROM Categorias c WHERE c.categoria = :categoria")
, @NamedQuery(name = "Categorias.removeCategoria", query = "DELETE FROM Categorias c WHERE c.categoria = :categoria")})
public class Categorias implements Serializable {

private static final long serialVersionUID = 1L;
@Id
@Basic(optional = false)
@NotNull
@Size(min = 1, max = 200)
@Column(name = "CATEGORIA")
private String categoria;
@OneToMany(cascade = CascadeType.ALL, mappedBy = "categoriaCategorias")
private Collection<Produtos> produtosCollection;

public Categorias() {
}

public Categorias(String categoria) {
    this.categoria = categoria;
}

public String getCategoria() {
    return categoria;
}

public void setCategoria(String categoria) {
    this.categoria = categoria;
}

@XmlTransient
public Collection<Produtos> getProdutosCollection() {
    return produtosCollection;
}

public void setProdutosCollection(Collection<Produtos> produtosCollection) {
    this.produtosCollection = produtosCollection;
}

@Override
public int hashCode() {
    int hash = 0;
    hash += (categoria != null ? categoria.hashCode() : 0);
    return hash;
}

@Override
public boolean equals(Object object) {
    // TODO: Warning - this method won't work in the case the id fields are not set
    if (!(object instanceof Categorias)) {
        return false;
    }
    Categorias other = (Categorias) object;
    if ((this.categoria == null && other.categoria != null) || (this.categoria != null && !this.categoria.equals(other.categoria))) {
        return false;
    }
    return true;
}

@Override
public String toString() {
    return "entities.Categorias[ categoria=" + categoria + " ]";
}

}

ApagarCategoria.xhtml

<?xml version='1.0' encoding='UTF-8' ?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml"
  xmlns:h="http://xmlns.jcp.org/jsf/html"
  xmlns:f="http://xmlns.jcp.org/jsf/core">
<h:head>
    <title>Apagar Categoria</title>
</h:head>
<h:body>
    <br></br>
    <div align="center" >
        <h1 align="center">Lista de Categorias</h1>

        <div align ="center">
<h:form>
            <h:dataTable value = "#{registarVendedor.listarCategorias()}" var = "c" 
                         styleClass = "authorTable" 
                         headerClass = "authorTableHeader" 
                         rowClasses = "authorTableOddRow,authorTableEvenRow"
                         width = "600">

                <h:column><f:facet name = "header"> Categoria </f:facet>
                        #{c.categoria}
                    <f:facet name = "header2"> </f:facet> 
                </h:column>
                <h:column>

                    <p> <h:commandButton value="Delete" class="button1" action="#{registarVendedor.deleteCtg(c)}">
                                    <f:setPropertyActionListener target="#{registarVendedor.categoria}" value="#{c}"/> 
                                </h:commandButton></p>  

                </h:column>

            </h:dataTable>
</h:form>
        </div>
        <h:form >
            <p> <h:commandButton value="Voltar" class="button1" action="MenuVendedor"></h:commandButton></p>
        </h:form>
    </div>
</h:body>

I know that there are doubts alike but I have tried the solutions and it does not work

1
Welcome to Stack Overflow! That looks like more code than strictly needed. Can you reduce the code further until no code can be removed while still running into the problem?Morse
Next time narrow down the problem. A problem is in 99.99% of the case not jsf and sql related. If you'd tried with a static list you'd have the same problem. Java(-se) is for problems that are in the base jdk so that you can reproduce with just a class with a main. And if you'd done a minimal reproducible example with just a commandButton and the same method call you'd have the same problem. So not datatable related either. Your title is for your functional problem but there is most often (almost always) an underling technical problem. Focus on that, describe that in the title. CheersKukeltje

1 Answers

1
votes

The error is

Unable to find matching navigation

The return value "#{registarVendedor.deleteCtg(c)}" is used by JSF to determine which view should be viewed next. But you are return a list so jsf got lost. You need to return a String or void.

If you do this, it will work

public void deleteCtg(Categorias ct) {        
     categoriasList = registarVendedor.removeCtg(ct);
} 

Do you really need that list? You can get it with the getCategoriasList().