java.lang.NullPointerException 尝试使用 JSF、Primefaces 3.5 和 Glassfish 3.1.2.2 渲染视图时 ShoppingCart.xhtml

java.lang.NullPointerException when trying to rendering view ShoppingCart.xhtml with JSF, Primefaces 3.5 and Glassfish 3.1.2.2

我对这个在线商店的 Web 应用程序有疑问。当我单击“添加到购物车”或“购物车”按钮时,Glassfish 显示此错误:

Advertencia: PWC4011: Unable to set request character encoding to UTF-8 from context /Web_GLOBAL_Bookstore, because request parameters have already been read, or ServletRequest.getReader() has already been called
Grave: Error Rendering View[/CarritodeCompras.xhtml]
java.lang.NullPointerException
    at org.primefaces.component.celleditor.CellEditorRenderer.encodeEnd(CellEditorRenderer.java:38)
    at javax.faces.component.UIComponentBase.encodeEnd(UIComponentBase.java:875)
    at javax.faces.component.UIComponent.encodeAll(UIComponent.java:1764)
    at javax.faces.component.UIComponent.encodeAll(UIComponent.java:1760)
    at org.primefaces.component.datatable.DataTableRenderer.encodeCell(DataTableRenderer.java:808)
    at org.primefaces.component.datatable.DataTableRenderer.encodeRow(DataTableRenderer.java:773)
    at org.primefaces.component.datatable.DataTableRenderer.encodeTbody(DataTableRenderer.java:651)
    at org.primefaces.component.datatable.DataTableRenderer.encodeRegularTable(DataTableRenderer.java:234)
    at org.primefaces.component.datatable.DataTableRenderer.encodeMarkup(DataTableRenderer.java:196)
    at org.primefaces.component.datatable.DataTableRenderer.encodeEnd(DataTableRenderer.java:82)
    at javax.faces.component.UIComponentBase.encodeEnd(UIComponentBase.java:875)
    at javax.faces.component.UIComponent.encodeAll(UIComponent.java:1764)
    at javax.faces.render.Renderer.encodeChildren(Renderer.java:168)
    at javax.faces.component.UIComponentBase.encodeChildren(UIComponentBase.java:845)
    at javax.faces.component.UIComponent.encodeAll(UIComponent.java:1757)
    at javax.faces.component.UIComponent.encodeAll(UIComponent.java:1760)
    at javax.faces.component.UIComponent.encodeAll(UIComponent.java:1760)
    at com.sun.faces.application.view.FaceletViewHandlingStrategy.renderView(FaceletViewHandlingStrategy.java:402)
    at com.sun.faces.application.view.MultiViewHandler.renderView(MultiViewHandler.java:131)
    at com.sun.faces.lifecycle.RenderResponsePhase.execute(RenderResponsePhase.java:121)
    at com.sun.faces.lifecycle.Phase.doPhase(Phase.java:101)
    at com.sun.faces.lifecycle.LifecycleImpl.render(LifecycleImpl.java:139)
    at javax.faces.webapp.FacesServlet.service(FacesServlet.java:594)
    at org.apache.catalina.core.StandardWrapper.service(StandardWrapper.java:1550)
    at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:281)
    at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:175)
    at org.apache.catalina.core.StandardPipeline.doInvoke(StandardPipeline.java:655)
    at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:595)
    at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:161)
    at org.apache.catalina.connector.CoyoteAdapter.doService(CoyoteAdapter.java:331)
    at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:231)
    at com.sun.enterprise.v3.services.impl.ContainerMapper$AdapterCallable.call(ContainerMapper.java:317)
    at com.sun.enterprise.v3.services.impl.ContainerMapper.service(ContainerMapper.java:195)
    at com.sun.grizzly.http.ProcessorTask.invokeAdapter(ProcessorTask.java:860)
    at com.sun.grizzly.http.ProcessorTask.doProcess(ProcessorTask.java:757)
    at com.sun.grizzly.http.ProcessorTask.process(ProcessorTask.java:1056)
    at com.sun.grizzly.http.DefaultProtocolFilter.execute(DefaultProtocolFilter.java:229)
    at com.sun.grizzly.DefaultProtocolChain.executeProtocolFilter(DefaultProtocolChain.java:137)
    at com.sun.grizzly.DefaultProtocolChain.execute(DefaultProtocolChain.java:104)
    at com.sun.grizzly.DefaultProtocolChain.execute(DefaultProtocolChain.java:90)
    at com.sun.grizzly.http.HttpProtocolChain.execute(HttpProtocolChain.java:79)
    at com.sun.grizzly.ProtocolChainContextTask.doCall(ProtocolChainContextTask.java:54)
    at com.sun.grizzly.SelectionKeyContextTask.call(SelectionKeyContextTask.java:59)
    at com.sun.grizzly.ContextTask.run(ContextTask.java:71)
    at com.sun.grizzly.util.AbstractThreadPool$Worker.doWork(AbstractThreadPool.java:532)
    at com.sun.grizzly.util.AbstractThreadPool$Worker.run(AbstractThreadPool.java:513)
    at java.lang.Thread.run(Thread.java:745)


这是我的CarritodeCompras.xhtml

<?xml version="1.0" encoding="UTF-8"?>
<!--
To change this template, choose Tools | Templates
and open the template in the editor.
-->
<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml" 
      xmlns:ui="http://java.sun.com/jsf/facelets"
      xmlns:h="http://java.sun.com/jsf/html"
      xmlns:p="http://primefaces.org/ui"
      xmlns:f="http://java.sun.com/jsf/core">
    <h:head>
        <link href="https://cdn.jsdelivr.net/npm/bootstrap@5.0.0-beta2/dist/css/bootstrap.min.css" rel="stylesheet"
              integrity="sha384-BmbxuPwQa2lc/FVzBcNJ7UAyJxM6wuqIj61tLrc4wSX0szH/Ev+nYRRuWlolflfl" crossorigin="anonymous" />
        <link rel="stylesheet" href="css/imagehover.min.css" />
        <link rel="stylesheet" href="css/imagehover.css" />
        <link rel="stylesheet" href="css/demo-page.css" />
        <link rel="stylesheet" href="css/disenio.css" />
        <f:event type="preRenderView" listener="#{JSFManagedBeanInicioSession.estaLogueado()}" />
        <title>Carrito de Compras</title>
    </h:head>
    <h:body>
        <h:form id="form">
            <h1>  
                <FONT FACE="castellar" SIZE="11" COLOR="light blue">
                    Carrito de Compras de "GLOBAL Bookstore"</FONT>
            </h1>
          
            <p:dataTable id="carrocompra" value="#{ManagedCarrito.listaCarritoCompra}" var="carrito" paginator="false" editable="true" editMode="cell">
                <f:facet name="header">
                    Carrito de Compras
                </f:facet>
                <p:column headerText="Imagen">
                    <p:graphicImage alt="Sin imagen disponible" value="ruta de la imagen" style="width: 120px;height: 100px;"/>
                </p:column>
                <p:column headerText="Título del libro">
                    <h:outputText value="#{carrito.titulo}"/>
                </p:column>
                <p:column headerText="Autor">
                    <h:outputText value="#{carrito.autor}"/>
                </p:column>
                <p:column headerText="Editorial">
                    <h:outputText value="#{carrito.editorial}"/>
                </p:column>
                <p:column headerText="Precio">
                    <h:outputText value="#{carrito.precio}"/>
                </p:column>
                <p:column headerText="Stock disponible">
                    <h:outputText value="#{carrito.cantidad}"/>
                </p:column>
                <p:column headerText="Cantidad a comprar">
                    <p:cellEditor>
                        <f:facet name="input">
                            <h:inputText value="#{carrito.canticompra}"/>
                        </f:facet>
                    </p:cellEditor>
                </p:column>
                <p:column headerText="">
                    <p:commandLink  actionListener="#{ManagedCarrito.retirarItem(carrito.idLibro)}" ajax="false" value="Quitar item">
                        <h:outputText value="Quitar item"/>
                    </p:commandLink>
                </p:column>
            </p:dataTable>
            <p:panelGrid columns="2" styleClass="navbar-form navbar-left">
                <p:commandButton process="carrocompra" value="Comprar libros" oncomplete="multiCarDialog.show()"/> 
                <p:commandButton value="Regresar a la página de libros" action="/DesplegarTodos?faces-redirect=true"/>
            </p:panelGrid>
            <p:dialog header="Libros seleccionados" widgetVar="multiCarDialog" modal="true" showEffect="slide" hideEffect="slide" resizable="false" width="460">
                <f:facet name="header">
                    Por favor, confirme su compra
                </f:facet>
                <p:outputPanel id="multiCarDetail" style="text-align: center;">
                    <p:outputLabel value="Libros a comprar;"/>
                    <p:panelGrid columns="2">
                        <h:outputText value="Libro: #{carrito.titulo}" style="display: block"/>
                        <h:outputText value="Cantidad: #{carrito.canticompra}" style="display: block"/>
                    </p:panelGrid>
                </p:outputPanel>
                <f:facet name="footer">
                    <p:commandButton value="Confirmar la compra" ajax="false" action="#{ManagedCarrito.compraValida()}" oncomplete="multiCarDialog.hide()"/>
                </f:facet>
            </p:dialog>
        </h:form>
    </h:body>
</html>

还有我的ManagedCarrito.java

import Entidades.Cliente;
import Entidades.DetalleVenta;
import Entidades.Libro;
import Entidades.Venta;
import Sessions.ClienteFacadeLocal;
import Sessions.DetalleVentaFacadeLocal;
import Sessions.LibroFacadeLocal;
import Sessions.VentaFacadeLocal;
import java.io.Serializable;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.Date;
import java.util.List;
import javax.annotation.PostConstruct;
import javax.ejb.EJB;
import javax.faces.application.FacesMessage;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.SessionScoped;
import javax.faces.context.FacesContext;
import javax.swing.JOptionPane;

/**
 *
 * @author
 */
@ManagedBean(name = "ManagedCarrito")
@SessionScoped
public class ManagedCarrito implements Serializable {

    private double total;
    private Cliente cliente;
    private Venta venta;
    private DetalleVenta detalleVenta;
    private Date fecha;
    @EJB
    private LibroFacadeLocal manejadorLibro;
    @EJB
    private VentaFacadeLocal manejadorVenta;
    @EJB
    private DetalleVentaFacadeLocal manejadorDetalleVenta;
    @EJB
    private ClienteFacadeLocal manejadorCliente;
    
    private Libro carroLibro;
    private List<Libro> listaLibros;
    private List<Libro> listaCarritoCompra;
    private int contador;
    

    public ManagedCarrito() {
        listaCarritoCompra = new ArrayList<>();
        total = 0;
        contador = 0;
    }

     public void addMessage(FacesMessage.Severity severity, String summary, String detail){
        FacesContext.getCurrentInstance().addMessage(null, new FacesMessage(severity, summary, detail));
    }
    @PostConstruct
    public void iniciar() {
        fecha = Calendar.getInstance().getTime();
        carroLibro = new Libro();
        cliente = new Cliente();
        venta = new Venta();
        detalleVenta = new DetalleVenta();
    }

    public void agregarAlCarrito(int idL) {
        carroLibro = new Libro();
        carroLibro = manejadorLibro.recuperarLibroPorId(idL);
        if (listaCarritoCompra.isEmpty()) {
            carroLibro.setCanticompra(1);
            listaCarritoCompra.add(carroLibro);
        } else {
            for (int i = 0; i < listaCarritoCompra.size(); i++) {
                if (carroLibro.getIdLibro() == listaCarritoCompra.get(i).getIdLibro()) {
                    listaCarritoCompra.get(i).setCanticompra(listaCarritoCompra.get(i).getCanticompra() + 1);
                    break;
                } else if (i == listaCarritoCompra.size() - 1) {
                    carroLibro.setCanticompra(1);
                    listaCarritoCompra.add(carroLibro);
                    break;
                }

            }
        }
        
        addMessage(FacesMessage.SEVERITY_INFO, "Producto agregado", "Se añadió el libro al carrito con éxtio");
    }
    
    public void retirarItem(int idL){
        for (int i = 0; i < listaCarritoCompra.size(); i++) {
            if(idL == listaCarritoCompra.get(i).getIdLibro()){
                listaCarritoCompra.remove(i);
                break;
            }
        }
        costesPrevios();
    }
    
    public void costesPrevios(){
        try{
            total=0;
            for (int i = 0; i < listaCarritoCompra.size(); i++) {
                total += listaCarritoCompra.get(i).getCanticompra()*listaCarritoCompra.get(i).getPrecio();
            }
            obtenerTotal();
        }catch(Exception e){
            JOptionPane.showMessageDialog(null, e.getMessage());
        }
    }
    
    public void compraValida(){
        try{
            int esValido=0;
            for (Libro libroValidar : listaCarritoCompra) {
                if(libroValidar.getCantidad()>=libroValidar.getCanticompra() && libroValidar.getCanticompra()>0){
                    esValido++;
                }
            }
            if(esValido == listaCarritoCompra.size() && !listaCarritoCompra.isEmpty()){
                comprar();
            }else{
                FacesContext.getCurrentInstance().addMessage(null, new FacesMessage(FacesMessage.SEVERITY_INFO,"Atención:","No puede comprar más libros que el stock existente"));
            }
        }catch(Exception e){
                FacesContext.getCurrentInstance().addMessage(null, new FacesMessage(FacesMessage.SEVERITY_INFO,"Atención:","Datos no válidos"));
        }
    }
    
    public void comprar(){
      Cliente clientes = (Cliente) FacesContext.getCurrentInstance().getExternalContext().getSessionMap().get("email");
      venta.setIdCliente(manejadorCliente.find(clientes.getIdCliente()));
      venta.setFecha(fecha);
      manejadorVenta.create(venta);
      List<Venta> reciboventa = manejadorVenta.findAll();
      int numrecibo = reciboventa.get(reciboventa.size()-1).getCodVenta();
        for (int i = 0; i < listaCarritoCompra.size(); i++) {
            listaCarritoCompra.get(i).setCantidad(listaCarritoCompra.get(i).getCantidad() - listaCarritoCompra.get(i).getCanticompra());
            detalleVenta = new DetalleVenta();
            detalleVenta.setCodVenta(manejadorVenta.find(numrecibo));
            detalleVenta.setIddetalleVenta(i+1);
            detalleVenta.setCodLibro(manejadorLibro.find(listaCarritoCompra.get(i).getIdLibro()));
            int auxcantidad=0;
            auxcantidad=listaCarritoCompra.get(i).getCanticompra();
            double auxprecio=0;
            auxprecio=auxcantidad*listaCarritoCompra.get(i).getPrecio();
            detalleVenta.setCantidad(auxcantidad);
            detalleVenta.setTotal(auxprecio);
            manejadorDetalleVenta.create(detalleVenta);
            actualizarInventario(detalleVenta);
            
        }
        listaCarritoCompra.clear();
        total=0;
        FacesContext.getCurrentInstance().addMessage(null, new FacesMessage(FacesMessage.SEVERITY_INFO,"¡Éxito!:","Compra realizada satisfactoriamente"));
      
    }
    
    public void actualizarInventario(DetalleVenta dv){
        carroLibro = new Libro();
        int code = dv.getCodLibro().getIdLibro();
        carroLibro = manejadorLibro.find(code);
        int inventarioActualizado;
        inventarioActualizado = carroLibro.getCanticompra()-dv.getCantidad();
        carroLibro.setCantidad(inventarioActualizado);
        manejadorLibro.edit(carroLibro);
        this.listaLibros = manejadorLibro.findAll();
    }

    public void obtenerTotal(){
        total = total+0;
    }
    public double getTotal() {
        return total;
    }

    public Libro getLibro(){
        return carroLibro;
    }
    
    public void setLibro(Libro libro){
        this.carroLibro = libro;
    }

    public void setTotal(double total) {
        this.total = total;
    }

    public Cliente getCliente() {
        return cliente;
    }

    public void setCliente(Cliente cliente) {
        this.cliente = cliente;
    }

    public Venta getVenta() {
        return venta;
    }

    public void setVenta(Venta venta) {
        this.venta = venta;
    }

    public DetalleVenta getDetalleVenta() {
        return detalleVenta;
    }

    public void setDetalleVenta(DetalleVenta detalleVenta) {
        this.detalleVenta = detalleVenta;
    }

    public Date getFecha() {
        return fecha;
    }

    public void setFecha(Date fecha) {
        this.fecha = fecha;
    }

    public LibroFacadeLocal getManejadorLibro() {
        return manejadorLibro;
    }

    public void setManejadorLibro(LibroFacadeLocal manejadorLibro) {
        this.manejadorLibro = manejadorLibro;
    }

    public VentaFacadeLocal getManejadorVenta() {
        return manejadorVenta;
    }

    public void setManejadorVenta(VentaFacadeLocal manejadorVenta) {
        this.manejadorVenta = manejadorVenta;
    }

    public DetalleVentaFacadeLocal getManejadorDetalleVenta() {
        return manejadorDetalleVenta;
    }

    public void setManejadorDetalleVenta(DetalleVentaFacadeLocal manejadorDetalleVenta) {
        this.manejadorDetalleVenta = manejadorDetalleVenta;
    }

    public ClienteFacadeLocal getManejadorCliente() {
        return manejadorCliente;
    }

    public void setManejadorCliente(ClienteFacadeLocal manejadorCliente) {
        this.manejadorCliente = manejadorCliente;
    }

    public Libro getCarroLibro() {
        return carroLibro;
    }

    public void setCarroLibro(Libro carroLibro) {
        this.carroLibro = carroLibro;
    }

    public List<Libro> getListaLibros() {
        return listaLibros;
    }

    public void setListaLibros(List<Libro> listaLibros) {
        this.listaLibros = listaLibros;
    }

    public List<Libro> getListaCarritoCompra() {
        return listaCarritoCompra;
    }

    public void setListaCarritoCompra(List<Libro> listaCarritoCompra) {
        this.listaCarritoCompra = listaCarritoCompra;
    }

    public int getContador() {
        return contador;
    }

    public void setContador(int contador) {
        this.contador = contador;
    }
}

怎么了?你能帮我吗?我使用 Primefaces 3.5、Bootstrap、CSS、Glassfish 3.1.2.2、PostgreSQL 和 Netbeans 7.3.1

我在 commandButton 中漏掉了一个 <f:facet: name="output"> </f:facet>。谢谢。我爱妮!