primefaces editar(sol)
Hola atodos, estoy realizando un datatable editable de primefaces y me da el siguiente error al modificar un campo en la tabla:
: javax.faces.component.UpdateModelException: javax.el.PropertyNotWritableException:pagina1.xhtml @47,113 value="#{comentario.fecha}": Propiedad 'fecha' no grabable para el tipo paquete.comentario
El campo fecha es date , por lo he puesto esto en la columa fecha del datatable.
<p:column headerText="Comentario" sortBy="#{comentario.fecha}" >
<p:cellEditor>
<f:facet name="output"><h:outputText value="#{comentario.fecha}" /></f:facet>
<f:facet name="input"><p:inputText value="#{comentario.fecha}" style="width:100%" >
<f:convertDateTime pattern="MM/dd/yyyy" />
</p:inputText></f:facet>
</p:cellEditor>
</p:column>
<p:cellEditor>
<f:facet name="output"><h:outputText value="#{comentario.fecha}" /></f:facet>
<f:facet name="input"><p:inputText value="#{comentario.fecha}" style="width:100%" >
<f:convertDateTime pattern="MM/dd/yyyy" />
</p:inputText></f:facet>
</p:cellEditor>
</p:column>
Y sigue dando error
Espero que me podais ayudar.gracias
- Inicie sesión o regístrese para enviar comentarios
Re: primefaces datatable date
Tal vez quieras usar Calendar:
<f:facet name="output"><h:outputText value="#{comentario.fecha}" /></f:facet>
<f:facet name="input"><p:calendar value="#{comentario.fecha}" pattern="MM/dd/yyyy" /></f:facet>
</p:cellEditor>
~~~
He puesto la linea de codigo
He puesto la linea de codigo de calendar y no se muestra en el navegdor el datatable y me da el siguiente error
com.sun.faces.context.AjaxExceptionHandlerImpl handlePartialResponseError
GRAVE: java.lang.IllegalArgumentException: Cannot format given Object as a Date
at java.text.DateFormat.format(DateFormat.java:310)
at java.text.Format.format(Format.java:157)
Setter
La excepción javax.el.PropertyNotWritableException ocurre cuando la propiedad a la que haces referencia no tiene un metodo setter para asignar el valor, en tu caso, asegurate que la propiedad o variable "fecha" tenga un método llamado setFecha. Sería bueno que colocaras en código de las clases java que estas utilizando.
editar error
Tengo puesto el metodo setFecha
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Basic(optional = false)
@Column(name = "idComentario")
private Integer idComentario;
@Column(name = "fecha")
@Temporal(TemporalType.TIMESTAMP)
private Date fecha;
public Comentario() {
}
public Integer getIdComentario() {
return idComentario;
}
public void setIdComentario(Integer idComentario) {
this.idComentario = idComentario;
}
public String getFecha() {
//return fecha;
SimpleDateFormat formateador = new SimpleDateFormat("dd/MM/yyyy");
return formateador.format(fecha);
}
public void setFecha(Date fecha) {
this.fecha = fecha;
}
---------------
@SessionScoped
public class EditComentarioView implements Serializable¨{
List<Comentario> comentarios;
--------------
public void onRowEdit(RowEditEvent event) {
Comentario comentario = (Comentario) event.getObject();
dao.updateComentarios(comentario);
FacesMessage msg = new FacesMessage("Comentario modificada","");
FacesContext.getCurrentInstance().addMessage(null, msg);
}
}
Me da el siguiente error
Caused by: javax.el.PropertyNotWritableException: Propiedad 'fecha' no grabable para el tipo paquete.Comentario
at javax.el.BeanELResolver$BeanProperty.write(BeanELResolver.java:323)
at javax.el.BeanELResolver$BeanProperty.access$100(BeanELResolver.java:283)
at javax.el.BeanELResolver.setValue(BeanELResolver.java:125)
at com.sun.faces.el.DemuxCompositeELResolver._setValue(DemuxCompositeELResolver.java:255)
at com.sun.faces.el.DemuxCompositeELResolver.setValue(DemuxCompositeELResolver.java:281)
at org.apache.el.parser.AstValue.setValue(AstValue.java:202)
at org.apache.el.ValueExpressionImpl.setValue(ValueExpressionImpl.java:257)
at com.sun.faces.facelets.el.TagValueExpression.setValue(TagValueExpression.java:131)
Re: calendar
Hice una pequeña prueba, y funciona perfectamente.
La clase dominio:
import java.util.Date;
public class Comment {
private Date date;
private String content;
public Comment() {
}
public Comment(Date date, String content) {
this.date = date;
this.content = content;
}
public Date getDate() {
return date;
}
public void setDate(Date date) {
this.date = date;
}
public String getContent() {
return content;
}
public void setContent(String content) {
this.content = content;
}
}
El bean de JSF:
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import javax.enterprise.inject.Model;
import org.primefaces.event.CellEditEvent;
@Model
public class CommentView {
private List<Comment> comments;
public List<Comment> getComments() {
if (comments == null) {
comments = new ArrayList<>();
comments.add(new Comment(new Date(), "First comment."));
comments.add(new Comment(new Date(), "Second comment."));
}
return comments;
}
public void onCellEdit(CellEditEvent event) {
Object oldValue = event.getOldValue();
Object newValue = event.getNewValue();
System.out.printf("Old: %s, New: %s%n", oldValue, newValue);
}
}
La página JSF:
<!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:f="http://xmlns.jcp.org/jsf/core"
xmlns:p="http://primefaces.org/ui">
<h:head>
<title>Facelet Title</title>
</h:head>
<h:body style="padding: 150px">
<h:form>
<p:dataTable var="comment" value="#{commentView.comments}" editable="true" editMode="cell" >
<p:ajax event="cellEdit" listener="#{commentView.onCellEdit}" />
<p:column headerText="Content">
<p:cellEditor>
<f:facet name="output"><h:outputText value="#{comment.content}" /></f:facet>
<f:facet name="input"><p:inputText value="#{comment.content}" /></f:facet>
</p:cellEditor>
</p:column>
<p:column headerText="Date">
<p:cellEditor>
<f:facet name="output"><h:outputText value="#{comment.date}">
<f:convertDateTime pattern="MM/dd/yyyy" />
</h:outputText></f:facet>
<f:facet name="input"><p:calendar value="#{comment.date}" pattern="MM/dd/yyyy" /></f:facet>
</p:cellEditor>
</p:column>
</p:dataTable>
</h:form>
</h:body>
</html>
Una posible salida:
P.D.: Use PrimeFaces 5.2 y Glassfish 4.
~~~
editar error
Hola jpaul,
Cuando realizas la pagina jsf, mas concretamente esta parte
<p:cellEditor>
<f:facet name="output"><h:outputText value="#{comment.date}">
<f:convertDateTime pattern="MM/dd/yyyy" />
</h:outputText></f:facet>
<f:facet name="input"><p:calendar value="#{comment.date}" pattern="MM/dd/yyyy" /></f:facet>
</p:cellEditor>
</p:column
¿Cuando pone usted comment.date el netbeans te lo reconoce como String o date?. A mi como string y sigo con el mismo error de ayer
Re: String o date
¿A qué te refieres?
Bueno, en NetBeans me aparece algo así:
El “date Date” que aparece en el tooptip está directamente relacionado con el campo
date
de tipojava.util.Date
en la claseComment
del ejemplo que puse:public Date getDate() {
return date;
}
public void setDate(Date date) {
this.date = date;
}
Para que el
p:calendar
funcione, éste requiere una propiedad que regrese (getter) y reciba (setter) una instancia dejava.util.Date
.~~~
sol edit
Cambio en el metodo date ,en vez de poner string pongo date.(solucion)
gracias