java.lang.NullPointerException当尝试用JSF、Primefaces 3.5和Glassfi



我在网上商店的这个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)

这是我的CarritodCompras.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>。谢谢哇!

最新更新