Solucionado (ver solução)
Solucionado
(ver solução)
4
respostas

Erro ao enviar informações com JSF

Boa tarde,

Senhores estou tentando fazer uma tela de comentários a qual possui uma pontuação e uma simples caixa de texto, mas ao tentar enviar as informações sou abordado com a seguinte tela de erro.

GRAVE: javax.faces.component.UpdateModelException: javax.el.PropertyNotWritableException: /avaliacao.xhtml @66,76 value="#{ratingView.comentario} ": Illegal Syntax for Set Operation
    at javax.faces.component.UIInput.updateModel(UIInput.java:866)
    at javax.faces.component.UIInput.processUpdates(UIInput.java:749)
    at javax.faces.component.UIComponentBase.processUpdates(UIComponentBase.java:1291)
    at javax.faces.component.UIForm.processUpdates(UIForm.java:281)
    at org.primefaces.component.api.UIData.process(UIData.java:385)
    at org.primefaces.component.api.UIData.processChildren(UIData.java:370)
    at org.primefaces.component.api.UIData.processPhase(UIData.java:328)
    at org.primefaces.component.api.UIData.processUpdates(UIData.java:314)
    at javax.faces.component.UIForm.processUpdates(UIForm.java:281)
    at javax.faces.component.UIComponentBase.processUpdates(UIComponentBase.java:1291)
    at javax.faces.component.UIComponentBase.processUpdates(UIComponentBase.java:1291)
    at javax.faces.component.UIViewRoot.processUpdates(UIViewRoot.java:1254)
    at com.sun.faces.lifecycle.UpdateModelValuesPhase.execute(UpdateModelValuesPhase.java:78)
    at com.sun.faces.lifecycle.Phase.doPhase(Phase.java:101)
    at com.sun.faces.lifecycle.LifecycleImpl.execute(LifecycleImpl.java:198)
    at javax.faces.webapp.FacesServlet.service(FacesServlet.java:658)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:231)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
    at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
    at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:198)
    at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:96)
    at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:478)
    at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:140)
    at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:80)
    at org.apache.catalina.valves.AbstractAccessLogValve.invoke(AbstractAccessLogValve.java:650)
    at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:87)
    at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:342)
    at org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:799)
    at org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:66)
    at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:868)
    at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1457)
    at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:49)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source)
    at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)
    at java.lang.Thread.run(Unknown Source)
Caused by: javax.el.PropertyNotWritableException: /avaliacao.xhtml @66,76 value="#{ratingView.comentario} ": Illegal Syntax for Set Operation
    at com.sun.faces.facelets.el.TagValueExpression.setValue(TagValueExpression.java:136)
    at javax.faces.component.UIInput.updateModel(UIInput.java:832)
    ... 37 more
Caused by: javax.el.PropertyNotWritableException: Illegal Syntax for Set Operation
    at org.apache.el.parser.SimpleNode.setValue(SimpleNode.java:137)
    at org.apache.el.ValueExpressionImpl.setValue(ValueExpressionImpl.java:257)
    at com.sun.faces.facelets.el.TagValueExpression.setValue(TagValueExpression.java:131)
    ... 38 more
4 respostas

Tela de Avaliação

<?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:f="http://xmlns.jcp.org/jsf/core"
    xmlns:ui="http://xmlns.jcp.org/jsf/facelets"
    xmlns:p="http://primefaces.org/ui">

<ui:composition template="_template.xhtml">

    <f:metadata>

        <f:metadata>
            <f:event type="preRenderView" listener="#{ratingView.recebeObjeto}" />
        </f:metadata>

    </f:metadata>


    <ui:define name="titulo">
        <p:outputPanel>Avaliacao</p:outputPanel>
    </ui:define>


    <ui:define name="conteudo">

        <h:form>
            <p:dataScroller value="#{ratingView.livro}" var="livro">
                <f:facet name="header">
            Avalie está obra
        </f:facet>

                <h:panelGrid columns="2" style="width:100%">


                    <p:outputPanel>
                        <h:panelGrid columns="2" cellpadding="5">
                            <h:outputText value="Titulo da Obra:" />
                            <h:outputText value="#{livro.titulo}" style="font-weight: bold" />

                            <h:outputText value="ISBN:" />
                            <h:outputText value="#{livro.isbn}" style="font-weight: bold" />

                            <h:outputText value="Data de Lançamento:" />
                            <h:outputText value="#{livro.dataLancamento.time}"
                                style="font-weight: bold">
                                <f:convertDateTime pattern="dd/MM/yyyy"
                                    timeZone="America/Sao_Paulo" />
                            </h:outputText>



                            <p:rating value="#{ratingView.rating3}" />

                        </h:panelGrid>

                    </p:outputPanel>
                </h:panelGrid>


                <p:growl id="messages" showDetail="true" />

                <h:form>
                    <h:panelGrid columns="1" cellpadding="5">
                        //Este é o metodo que volta o erro de sintaxy.
                        <p:inputText rows="12" cols="50" value="#{ratingView.comentario} " />


                    </h:panelGrid>
                </h:form>



                <p:commandButton value="Gravar" update="display"
                    oncomplete="PF('dlg').show()" style="margin:5px"
                    action="#{ratingView.gravarAvaliacao}" />

                <p:dialog header="Values" widgetVar="dlg" showEffect="fade"
                    hideEffect="fade">
                    <h:panelGrid id="display" columns="2" cellpadding="5">

                        <h:outputText value="Rating 3:" />
                        <h:outputText value="#{livroBean.livro.avaliacao}" />
                    </h:panelGrid>
                </p:dialog>




            </p:dataScroller>


        </h:form>



    </ui:define>

</ui:composition>

</html>

Clinton,

Você tem uma classe Bean ratingView e nela você deve ter um getter e setter para o atributo comentario

getComentario e setComentario.

O erro está acontecendo aparentemente pois a sintaxe da sua classe não está implementando corretamente esses getters e setters.

Cloque o código da sua classe para olharmos.

package br.com.caelum.livraria.bean;

import javax.faces.bean.ManagedBean;
import javax.faces.bean.SessionScoped;
import javax.faces.context.FacesContext;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpSession;

import br.com.caelum.livraria.dao.DAO;
import br.com.caelum.livraria.modelo.Comentario;
import br.com.caelum.livraria.modelo.Livro;

@ManagedBean
@SessionScoped
public class RatingView {

    private Integer rating3;

    private Livro livro = new Livro();
    private Comentario comentario = new Comentario();




    public Comentario getComentario() {
        return null;
    }

    public void setComentario(Comentario comentario) {
        this.comentario = comentario;
    }

    public Livro getLivro() {
        return livro;
    }

    public void setLivro(Livro livro) {
        this.livro = livro;
    }

    /*
     * Recebe o objeto de livroBean e deixa disponivel para uso
     */
    public void recebeObjeto() {

        HttpServletRequest request = (HttpServletRequest) FacesContext.getCurrentInstance().getExternalContext()
                .getRequest();
        HttpSession session = (HttpSession) request.getSession();
        this.livro = (Livro) session.getAttribute("livroId");

    }

    public String gravarAvaliacao() {
        System.out.println("Gravando livro " + this.livro.getTitulo());

        // O metodo abaixo verifica se o livro possui um autor, caso não possua ele não
        // permite a gravação


        LivroBean livro = new LivroBean();
        livro.gravarComentario(this.comentario);
        DAO<Livro> dao = new DAO<Livro>(Livro.class);
        System.out.println(this.comentario);

        // Ao clicar no metodo gravar está condição é ativada, caso o livro já exista
        // ele é atualizado, caso contrario ele é atualizadoasd
        if (this.livro.getId() == null) {
            dao.adiciona(this.livro);

        } else {
            dao.atualiza(this.livro);
        }

        return "livro?faces-redirect=true";
    }

    /*
     * O metodo retorna null para assim que a pagina for carregada as estrelas estão
     * em branco
     */
    public Integer getRating3() {
        return null;
    }

    /*
     * Se o livro nunca foi avaliado ou seja se a avaliacao for nula entao é
     * atribuido o valor de estrelas atual se o valor não for nulo soma o valor
     * atual com o novo
     */
    public void setRating3(Integer rating3) {

        if (this.livro.getAvaliacao() == null) {
            this.livro.setAvaliacao(rating3);
        } else {
            Integer temp = this.livro.getAvaliacao() + rating3;
            this.livro.setAvaliacao(temp);

        }

    }

}
solução!

Clinton,

Você está tentando jogar o objeto comentario para dentro do componente inputtext. Você não deveria atribuir um atributo para esse objeto por exemplo: "mensagem" e ai sim exibir esse atributo no inputtext ?

Sua classe de modelo Comentario teria o atributo mensagem com os getters e setters e na hora de atribuir no formulário seria #{ratingView.comentario.mensagem} invés de #{ratingView.comentario}