尝试使用JSF、Primefaces 3.5和Glassfish 3.1.2.2呈现view ShoppingCart.xhtml时出现java.lang.NullPointerException

尝试使用JSF、Primefaces 3.5和Glassfish 3.1.2.2呈现view ShoppingCart.xhtml时出现java.lang.NullPointerException,jsf,primefaces,glassfish,Jsf,Primefaces,Glassfish,我对在线商店的这个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

我对在线商店的这个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>


卡里托德康帕斯酒店
Carrito de Compras de“全球书店”
卡里托德康帕斯酒店
帮我个忙,确认一下
还有我的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;
    }
}

导入实体客户;
进口实体;
进口实体Libro;
进口实体。文塔;
导入Sessions.ClienteFacadeLocal;
导入Sessions.DetalleVentaFacadeLocal;
导入Sessions.librofacadolocal;
导入Sessions.VentaFacadeLocal;
导入java.io.Serializable;
导入java.util.ArrayList;
导入java.util.Calendar;
导入java.util.Date;
导入java.util.List;
导入javax.annotation.PostConstruct;
导入javax.ejb.ejb;
导入javax.faces.application.FacesMessage;
导入javax.faces.bean.ManagedBean;
导入javax.faces.bean.SessionScoped;
导入javax.faces.context.FacesContext;
导入javax.swing.JOptionPane;
/**
*
*@作者
*/
@ManagedBean(name=“ManagedCarrito”)
@会议范围
公共类ManagedCarrito实现可序列化{
私人双总;
私人客户;
私人文塔文塔;
私人德塔勒文塔德塔勒文塔;
私人约会费恰;
@EJB
私人图书馆;
@EJB
私人文塔法卡德曼内加多文塔;
@EJB
私人德塔勒文塔法学院当地曼内贾多德塔勒文塔;
@EJB
私人客户facade本地Manejador客户;
私人利布罗卡拉利布罗;
私营上市公司;
私人上市公司;
康塔多私人酒店;
公共管理的carrito(){
listacarritompra=newarraylist();
总数=0;
康塔多=0;
}
public void addMessage(FacesMessage.Severity严重性、字符串摘要、字符串详细信息){
FacesContext.getCurrentInstance().addMessage(空,新的FacesMessage(严重性、摘要、详细信息));
}
@施工后
国际法院的公开无效(){
fecha=Calendar.getInstance().getTime();
carroLibro=新Libro();
客户=新客户();
文塔=新文塔();
detalleVenta=新的detalleVenta();
}
公共无效法律许可证(国际idL){
carroLibro=新Libro();
carroLibro=复发性肺孢子虫(idL);
if(listacarritompra.isEmpty()){
角叉菜(1);
上市公司(carroLibro);
}否则{
对于(int i=0;i=libroValidar.getCanticompra()&&libroValidar.getCanticompra()>0){
esValido++;
}
}
if(esValido==listacarritompra.size()&&!listacarritompra.isEmpty()){
compar();
}否则{
FacesContext.getCurrentInstance().addMessage(空,新的FacesMessage(FacesMessage.SEVERITY_INFO,“Atención:”,“不支持现有股票的版权交易”);
}
}捕获(例外e){
FacesContext.getCurrentInstance().addMessage(空,新的FacesMessage(FacesMessage.SEVERITY_INFO,“Atención:”,“Datos no válidos”);
}
}