当我运行并按下按钮“删除”时,页面向我显示此错误:
无法找到匹配的导航案例,其导航ID为'/ApagarCategoria.xhtml',动作为'#{registarVendedor.deleteCtg(c)}',结果为[[entities.Categorias [categoria = Carro]]'
控制者
在RegistoVendedor.java中,该函数是公共List 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;
}
}
在RegistoBean.java中,该函数是公共List 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数据库
@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>
我知道同样有疑问,但是我已经尝试了解决方案,但没有用
最佳答案
错误是
找不到匹配的导航
JSF使用返回值“#{registarVendedor.deleteCtg(c)}”来确定下一步应查看哪个视图。但是您返回一个列表,所以jsf迷路了。您需要返回String
或void
。
如果这样做,它将起作用
public void deleteCtg(Categorias ct) {
categoriasList = registarVendedor.removeCtg(ct);
}
您真的需要那个清单吗?您可以使用
getCategoriasList()
获得它。