Hola, tengo un problema al hacer el abm de libros, me sale que el objeto libro es inalcanzable y que fue resuelto a nulo, sera porque estoy usando todo los datos de tipo referencia? porque hice uno con puros datos primitivos y no tuve problemas, fijense en la pagina de JSF, la clase y la clase LibroBean creo que ahi tengo los errores pero no se,(SOLO EL BORRADO) :huh:
<?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:p="http://primefaces.org/ui">
<h:head>
<title>ABM Biblioteca</title>
</h:head>
<h:body>
<h:form id="frmBiblioteca" title="ABM Biblioteca">
<p:growl id="mensaje"/>
<p:panel id="pnlOpciones" header="ABM Biblioteca">
<p:menubar>
<p:menuitem value="Agregar Libro"/>
<p:menuitem value="Ordenar (A - Z)" actionListener="#{libroBean.ordenarAscendente()}" update="dtLibros"/>
<p:menuitem value="Ordenar (Z - A)" actionListener="#{libroBean.ordenarDescendente()}" update="dtLibros" />
<p:menuitem value="Buscar Libro" />
</p:menubar>
</p:panel>
<p:panelGrid id="pgAgrear" columns="2">
<p:outputLabel id="lblCodigo" value="Código: "/>
<p:inputNumber id="inpCodigo" value="#{libro.código}"/>
<p:outputLabel id="lblISBN" value="ISBN: "/>
<p:inputNumber id="inpISBN" value="#{libro.ISBN}"/>
<p:outputLabel id="lblTitulo" value="Titulo: "/>
<p:inputText id="inpTitulo" value="#{libro.titulo}"/>
<p:outputLabel id="lblPaginas" value="Cantidad Paginas: "/>
<p:inputNumber id="inpPaginas" value="#{cantPaginas}"/>
<p:outputLabel id="lblTematica" value="Tematica: "/>
<p:inputText id="inpTematica" value="#{libro.temática}"/>
<!--
private Autor autor;
private LocalDate fechaEdicion;-->
</p:panelGrid>
<p:dataTable id="dtLibros" var="libros" value="#{libroBean.libros}">
<p:column headerText="Codigo">
<h:outputText value="#{libros.código}"/>
</p:column>
<p:column headerText="ISBN">
<h:outputText value="#{libros.ISBN}"/>
</p:column>
<p:column headerText="Titulo">
<h:outputText value="#{libros.titulo}"/>
</p:column>
<p:column headerText="Cantidad Páginas">
<h:outputText value="#{libros.cantPaginas}"/>
</p:column>
<p:column headerText="Tematica">
<h:outputText value="#{libros.temática}"/>
</p:column>
<p:column headerText="Autor">
<h:outputText value="#{libros.autor.nombre} #{libros.autor.apellido}"/>
</p:column>
<p:column headerText="Fecha publicación">
<h:outputText value="#{libros.fechaEdicion.dayOfMonth}/#{libros.fechaEdicion.monthValue}/#{libros.fechaEdicion.year}"/>
</p:column>
<p:column headerText="Acción">
<p:commandButton id="btnEliminar" value="Eliminar" actionListener="#{libroBean.borrar(libros)}" update="dtLibros"/>
</p:column>
</p:dataTable>
</h:form>
</h:body>
</html>
/*
* To change this license header, choose License Headers in Project Properties.
* To change this template file, choose Tools | Templates
* and open the template in the editor.
*/
package apliacion.dao;
import aplicacion.modelo.dominio.Libro;
import java.util.List;
/**
*
* @author Ana Kéldysh
*/
public interface ILibroDAO{
public void agregar(Libro nuevo);
public void borrar(Libro borrado);
public void modificar(Libro modificado);
public void ordenarAscendente();
public void ordenarDescendente();
public List<Libro> buscarLibros(String buscado);
public List<Libro> mostrarLibros();
}
/*
* To change this license header, choose License Headers in Project Properties.
* To change this template file, choose Tools | Templates
* and open the template in the editor.
*/
package aplicacion.controlador.bean;
import apliacion.dao.ILibroDAO;
import aplicacion.dao.imp.ILibroDAOImp;
import aplicacion.modelo.dominio.Libro;
import java.io.Serializable;
import java.util.ArrayList;
import java.util.List;
import javax.annotation.PostConstruct;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.SessionScoped;
/**
*
* @author Ana Kéldysh
*/
@ManagedBean
@SessionScoped
public class LibroBean implements Serializable{
private Libro libro;
private ILibroDAO libroDAO;
private List<Libro> libros;
/**
* Creates a new instance of LibroBean
*/
public LibroBean() {
libroDAO = new ILibroDAOImp();
libros = new ArrayList<>();
}
public void generarLibros() {
libros = libroDAO.mostrarLibros();
}
@PostConstruct
public void iniciarLibro() {
libro = new Libro();
generarLibros();
}
public void agregar(Libro nuevo) {
libroDAO.agregar(nuevo);
}
public void borrar(Libro borrado) {
libroDAO.borrar(borrado);
}
public void modificar(Libro modificado) {
libroDAO.modificar(modificado);
}
public void ordenarAscendente() {
libroDAO.ordenarAscendente();
}
public void ordenarDescendente() {
libroDAO.ordenarDescendente();
}
public List<Libro> buscarLibros(String buscado) {
return libroDAO.buscarLibros(buscado);
}
public List<Libro> mostrarLibros() {
return libroDAO.mostrarLibros();
}
public Libro getLibro() {
return libro;
}
public void setLibro(Libro libro) {
this.libro = libro;
}
public ILibroDAO getLibroDAO() {
return libroDAO;
}
public void setLibroDAO(ILibroDAO libroDAO) {
this.libroDAO = libroDAO;
}
@Override
public String toString() {
return "LibroBean{" + "libro=" + libro + ", libroDAO=" + libroDAO + ", libros=" + libros + '}';
}
public List<Libro> getLibros() {
return libros;
}
public void setLibros(List<Libro> libros) {
this.libros = libros;
}
}
/*
* To change this license header, choose License Headers in Project Properties.
* To change this template file, choose Tools | Templates
* and open the template in the editor.
*/
package aplicacion.controlador.bean;
import apliacion.dao.ILibroDAO;
import aplicacion.dao.imp.ILibroDAOImp;
import aplicacion.modelo.dominio.Autor;
import aplicacion.modelo.dominio.Libro;
import java.time.LocalDate;
/**
*
* @author Ana Kéldysh
*/
public class Test {
public static void main(String[] args) {
ILibroDAO lista = new ILibroDAOImp();
lista.mostrarLibros().forEach((a) -> {
System.out.println(a.getCódigo());
});
System.out.println("Despues de borrar");
lista.borrar(new Libro(1, 1000, "Java Como Programar", 1000, "Programación", new Autor(), LocalDate.now()));
lista.mostrarLibros().forEach((a) -> {
System.out.println(a.getCódigo());
});
}
}
/*
* To change this license header, choose License Headers in Project Properties.
* To change this template file, choose Tools | Templates
* and open the template in the editor.
*/
package aplicacion.dao.imp;
import apliacion.dao.ILibroDAO;
import aplicacion.modelo.dominio.Libro;
import aplicacion.modelo.util.ListaLibros;
import java.io.Serializable;
import java.util.List;
/**
*
* @author Ana Kéldysh
*/
public class ILibroDAOImp implements ILibroDAO, Serializable {
private ListaLibros libros;
public ILibroDAOImp() {
libros = new ListaLibros();
}
@Override
public void agregar(Libro nuevo) {
libros.agregar(nuevo);
}
@Override
public void borrar(Libro borrado) {
libros.borrar(borrado);
}
@Override
public void modificar(Libro modificado) {
libros.modificar(modificado);
}
@Override
public void ordenarAscendente() {
libros.ordenarAscendente();
}
@Override
public void ordenarDescendente() {
libros.ordenarDescendente();
}
@Override
public List<Libro> buscarLibros(String buscado) {
return libros.buscarLibros(buscado);
}
@Override
public List<Libro> mostrarLibros() {
return libros.getLibros();
}
}
/*
* To change this license header, choose License Headers in Project Properties.
* To change this template file, choose Tools | Templates
* and open the template in the editor.
*/
package aplicacion.modelo.dominio;
import java.io.Serializable;
/**
*
* @author Ana Kéldysh
*/
public class Autor implements Serializable {
private String nombre;
private String apellido;
private Integer edad;
private String nacionalidad;
public Autor() {
}
public Autor(String nombre, String apellido, Integer edad, String nacionalidad) {
this.nombre = nombre;
this.apellido = apellido;
this.edad = edad;
this.nacionalidad = nacionalidad;
}
public String getNacionalidad() {
return nacionalidad;
}
public void setNacionalidad(String nacionalidad) {
this.nacionalidad = nacionalidad;
}
public String getNombre() {
return nombre;
}
public void setNombre(String nombre) {
this.nombre = nombre;
}
public String getApellido() {
return apellido;
}
public void setApellido(String apellido) {
this.apellido = apellido;
}
public Integer getEdad() {
return edad;
}
public void setEdad(Integer edad) {
this.edad = edad;
}
@Override
public String toString() {
return "Autor{" + "nombre=" + nombre + ", apellido=" + apellido + ", edad=" + edad + ", nacionalidad=" + nacionalidad + '}';
}
}
/*
* To change this license header, choose License Headers in Project Properties.
* To change this template file, choose Tools | Templates
* and open the template in the editor.
*/
package aplicacion.modelo.dominio;
import java.io.Serializable;
import java.time.LocalDate;
/**
*
* @author Ana Kéldysh
*/
public class Libro implements Serializable {
private Integer código;
private Integer ISBN;
private String titulo;
private Integer cantPaginas;
private String temática;
private Autor autor;
private LocalDate fechaEdicion;
public Libro() {
}
public Libro(Integer código, Integer ISBN, String titulo, Integer cantPaginas, String temática, Autor autor, LocalDate fechaEdicion) {
this.código = código;
this.ISBN = ISBN;
this.titulo = titulo;
this.cantPaginas = cantPaginas;
this.temática = temática;
this.autor = autor;
this.fechaEdicion = fechaEdicion;
}
public Integer getCódigo() {
return código;
}
public void setCódigo(Integer código) {
this.código = código;
}
public Integer getISBN() {
return ISBN;
}
public void setISBN(Integer ISBN) {
this.ISBN = ISBN;
}
public String getTitulo() {
return titulo;
}
public void setTitulo(String titulo) {
this.titulo = titulo;
}
public Integer getCantPaginas() {
return cantPaginas;
}
public void setCantPaginas(Integer cantPaginas) {
this.cantPaginas = cantPaginas;
}
public String getTemática() {
return temática;
}
public void setTemática(String temática) {
this.temática = temática;
}
public Autor getAutor() {
return autor;
}
public void setAutor(Autor autor) {
this.autor = autor;
}
public LocalDate getFechaEdicion() {
return fechaEdicion;
}
public void setFechaEdicion(LocalDate fechaEdicion) {
this.fechaEdicion = fechaEdicion;
}
@Override
public String toString() {
return "Libro{" + "c\u00f3digo=" + código + ", ISBN=" + ISBN + ", titulo=" + titulo + ", cantPaginas=" + cantPaginas + ", tem\u00e1tica=" + temática + ", autor=" + autor + ", fechaEdicion=" + fechaEdicion + '}';
}
}
/*
* To change this license header, choose License Headers in Project Properties.
* To change this template file, choose Tools | Templates
* and open the template in the editor.
*/
package aplicacion.modelo.util;
import aplicacion.modelo.dominio.Autor;
import java.io.Serializable;
import java.util.ArrayList;
import java.util.List;
/**
*
* @author Ana Kéldysh
*/
public class ListaAutores implements Serializable {
private List<Autor> autores;
public ListaAutores() {
autores = new ArrayList<>();
autores.add(new Autor("Vanessa", "Navarro", 34, "Argentina"));
autores.add(new Autor("Ana", "Kéldysh", 15, "Argentina"));
}
public List<Autor> getAutores() {
return autores;
}
public void setAutores(List<Autor> autores) {
this.autores = autores;
}
@Override
public String toString() {
return "ListaAutores{" + "autores=" + autores + '}';
}
}
/*
* To change this license header, choose License Headers in Project Properties.
* To change this template file, choose Tools | Templates
* and open the template in the editor.
*/
package aplicacion.modelo.util;
import aplicacion.modelo.dominio.Libro;
import java.io.Serializable;
import java.time.LocalDate;
import java.util.ArrayList;
import java.util.Comparator;
import java.util.List;
import javax.faces.application.FacesMessage;
import javax.faces.context.FacesContext;
/**
*
* @author Ana Kéldysh
*/
public class ListaLibros implements Serializable {
private List<Libro> libros;
private ListaAutores autores;
private List<Libro> auxiliar;
public ListaLibros() {
libros = new ArrayList<>();
autores = new ListaAutores();
auxiliar = new ArrayList<>();
libros.add(new Libro(1, 1000, "Java Como Programar", 1000, "Programación", autores.getAutores().get(0), LocalDate.now()));
libros.add(new Libro(2, 2000, "C++", 1000, "Programación", autores.getAutores().get(1), LocalDate.now()));
libros.add(new Libro(3, 3000, "Python", 1000, "Programación", autores.getAutores().get(1), LocalDate.now()));
}
public void agregar(Libro nuevo) {
libros.add(nuevo);
FacesContext fc = FacesContext.getCurrentInstance();
fc.addMessage(null, new FacesMessage("Agregado con exito!!"));
}
public void borrar(Libro borrado) {
boolean encontrado = false;
for (int i = 0; i < libros.size() && !encontrado; i++) {
if (libros.get(i).getCódigo().equals(borrado.getCódigo())) {
libros.remove(i);
encontrado = true;
}
}
if (encontrado) {
FacesContext fc = FacesContext.getCurrentInstance();
fc.addMessage(null, new FacesMessage("Borrado con exito!!"));
}
}
public void modificar(Libro modificado) {
boolean encontrado = false;
for (int i = 0; i < libros.size() && !encontrado; i++) {
if (libros.get(i).getCódigo().equals(modificado.getCódigo())) {
libros.set(i, modificado);
encontrado = true;
}
}
if (encontrado) {
FacesContext fc = FacesContext.getCurrentInstance();
fc.addMessage(null, new FacesMessage("Modificado con exito!!"));
}
}
public void ordenarAscendente() {
libros.sort(Comparator.comparing(Libro::getCódigo));
}
public void ordenarDescendente() {
libros.sort(Comparator.comparing(Libro::getCódigo).reversed());
}
public List<Libro> buscarLibros(String buscado) {
auxiliar.clear();
for (int i = 0; i < libros.size(); i++) {
if (libros.get(i).getTitulo().startsWith(buscado)) {
auxiliar.add(libros.get(i));
}
}
return auxiliar;
}
public List<Libro> getLibros() {
auxiliar.clear();
for (int i = 0; i < libros.size(); i++) {
auxiliar.add(libros.get(i));
}
return auxiliar;
}
public void setLibros(List<Libro> libros) {
this.libros = libros;
}
@Override
public String toString() {
return "ListaLibros{" + "libros=" + libros + ", autores=" + autores + '}';
}
public ListaAutores getAutores() {
return autores;
}
public void setAutores(ListaAutores autores) {
this.autores = autores;
}
public List<Libro> getAuxiliar() {
return auxiliar;
}
public void setAuxiliar(List<Libro> auxiliar) {
this.auxiliar = auxiliar;
}
}