0

I have a problem with this web application of an online store. When I click on "Add to Cart" or Shopping Cart button, Glassfish displays this error:

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)


This is my 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/[email protected]/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>

And my 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;
    }
}

What's wrong? Can you help me please? I use Primefaces 3.5, Bootstrap, CSS, Glassfish 3.1.2.2, PostgreSQL and Netbeans 7.3.1

3
  • 1
    Tried upgrading? Everything you've mentioned is quite old. Commented Mar 26, 2021 at 10:16
  • Yep, it's very old but that's what we should use, our teacher defined it that way. :( Commented Mar 26, 2021 at 14:17
  • Have you tried what suggested here stackoverflow.com/questions/19356867/…? Commented Mar 27, 2021 at 10:22

1 Answer 1

1

I missed a <f:facet: name="output"> </f:facet> in the commandButton. Thanks. WoAiNii!

Sign up to request clarification or add additional context in comments.

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.