Javax.el.PropertyNotWritableException: нелегальный синтаксис для операции установки

Я делаю проект в школу в JSF, и у меня мало проблем с этим.

Прежде всего, h: commandButton не работает должным образом, когда я хочу перенаправить себя на другую страницу проекта, нажав его. Отображается сообщение об ошибке:

javax.el.PropertyNotWritableException: нелегальный синтаксис для операции установки

index.jsp:

<?xml version="1.0" encoding="ISO-8859-1" ?>
<%@ page language="java" contentType="text/html; charset=ISO-8859-1"
    pageEncoding="ISO-8859-1"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

<%@ taglib uri="http://java.sun.com/jsf/html" prefix="h" %>  
<%@ taglib uri="http://java.sun.com/jsf/core" prefix="f" %>  

<html xmlns="http://www.w3.org/1999/xhtml" xmlns:h="http://java.sun.com/jsf/html" xmlns:f="http://java.sun.com/jsf/core">
  <head>
<title>Firma Komputerowa - Baza Danych</title>
<link rel="stylesheet" href="${pageContext.request.contextPath}/resources/table-style.css" />
  </head>
     <body>
       <f:view>
         <h:form>   
        <h:panelGrid columns="3">
     <h:commandButton action="#{producentBean.redirect }" value="Dodaj"/>
</h:panelGrid>
<h:panelGrid>
    <h:dataTable value="#{producentBean.List}" var="p" 
                styleClass="order-table"
                headerClass="order-table-header"
                rowClasses="order-table-odd-row,order-table-even-row" border="1" > 
        <h:column>
            <f:facet name="header">ID producenta</f:facet>
            <h:inputText value="#{p.getId}"/>
        </h:column>

        <h:column>
            <f:facet name="header">Nazwa producenta</f:facet>
            <h:inputText value="#{p.getNazwa}" />
        </h:column>

        <h:column>
            <f:facet name="header">NIP</f:facet>
            <h:inputText value="#{p.getNip}" />
        </h:column>

        <h:column>
            <f:facet name="header">REGON</f:facet>
            <h:inputText value="#{p.getRegon}" />
        </h:column>

        <h:column>
            <f:facet name="header">Miasto</f:facet>
            <h:inputText value="#{p.getMiasto}" />
        </h:column>

        <h:column>
            <f:facet name="header">Adres</f:facet>
            <h:inputText value="#{p.getAdres}" />
        </h:column>

        <h:column>
            <f:facet name="header">Telefon</f:facet>
            <h:inputText value="#{p.getTel}" />
        </h:column>

        <h:column>
            <f:facet name="header">E-mail</f:facet>
            <h:inputText value="#{p.getEmail}" />
        </h:column>
    </h:dataTable>
</h:panelGrid>
        </h:form>
       </f:view>
    ...
   </body>
</html>

ProducentBean.java:

    public class ProducentBean extends Polacz implements Serializable {

   public String redirect() {
    return "dodaj_pr";
}
}

Я пытался сделать это разными способами, но я не могу с этим справиться.

У меня также есть еще один вопрос: есть ли в JSF возможность динамически отображать таблицу из базы данных, например, выбрав имя таблицы, выбрав опцию? Моя база данных содержит три таблицы с разным количеством столбцов.

Я буду очень рад, если кто-нибудь даст мне несколько советов.


EDIT:

ОК, я попытался сделать это:

private String dodajPrUrl = "dodaj_pr?faces-redirect=true";

public String getDodajPrUrl() {
    return this.dodajPrUrl;
}

public void setDodajPrUrl(String newUrl) {
    this.dodajPrUrl = newUrl;
}

и в index.jsp:

<h:commandButton action="#{producentBean.redirect }" value="Dodaj" />

Это дает мне по-прежнему ту же ошибку.

EDIT2:

Трассировка стека:

SEVERE: javax.faces.FacesException: javax.el.PropertyNotWritableException: Illegal Syntax for Set Operation
javax.faces.FacesException: javax.el.PropertyNotWritableException: Illegal Syntax for  Set Operation
    at com.sun.faces.context.ExceptionHandlerImpl.handle(ExceptionHandlerImpl.java:142)
    at com.sun.faces.lifecycle.Phase.doPhase(Phase.java:119)
    at com.sun.faces.lifecycle.LifecycleImpl.execute(LifecycleImpl.java:118)
    at javax.faces.webapp.FacesServlet.service(FacesServlet.java:593)
    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:722)
Caused by: javax.faces.component.UpdateModelException: javax.el.PropertyNotWritableException: Illegal Syntax for Set Operation
    at javax.faces.component.UIInput.updateModel(UIInput.java:853)
    at javax.faces.component.UIInput.processUpdates(UIInput.java:735)
    at javax.faces.component.UIData.iterate(UIData.java:2001)
    at javax.faces.component.UIData.processUpdates(UIData.java:1253)
    at javax.faces.component.UIComponentBase.processUpdates(UIComponentBase.java:1242)
    at javax.faces.component.UIForm.processUpdates(UIForm.java:281)
    at javax.faces.component.UIComponentBase.processUpdates(UIComponentBase.java:1242)
    at javax.faces.component.UIViewRoot.processUpdates(UIViewRoot.java:1231)
    at com.sun.faces.lifecycle.UpdateModelValuesPhase.execute(UpdateModelValuesPhase.java:78)
    at com.sun.faces.lifecycle.Phase.doPhase(Phase.java:101)
    ... 26 more
Caused by: javax.el.PropertyNotWritableException: Illegal Syntax for Set Operation
    at com.sun.el.parser.AstValue.setValue(AstValue.java:207)
    at com.sun.el.ValueExpressionImpl.setValue(ValueExpressionImpl.java:291)
    at javax.faces.component.UIInput.updateModel(UIInput.java:818)
    ... 35 more

Ответ 1

Посмотрите на трассировку стека. Здесь самая важная часть:

Caused by: javax.faces.component.UpdateModelException: javax.el.PropertyNotWritableException: Illegal Syntax for Set Operation
    at javax.faces.component.UIInput.updateModel(UIInput.java:853)
    at javax.faces.component.UIInput.processUpdates(UIInput.java:735)
    at javax.faces.component.UIData.iterate(UIData.java:2001)
    at javax.faces.component.UIData.processUpdates(UIData.java:1253)
    at javax.faces.component.UIComponentBase.processUpdates(UIComponentBase.java:1242)
    at javax.faces.component.UIForm.processUpdates(UIForm.java:281)
    at javax.faces.component.UIComponentBase.processUpdates(UIComponentBase.java:1242)
    at javax.faces.component.UIViewRoot.processUpdates(UIViewRoot.java:1231)
    at com.sun.faces.lifecycle.UpdateModelValuesPhase.execute(UpdateModelValuesPhase.java:78)
    at com.sun.faces.lifecycle.Phase.doPhase(Phase.java:101)
    ... 26 more

Прочитайте снизу вверх. Во время фазы значений модели обновления JSF перемещается по дереву компонентов, начиная с компонента UIViewRoot (<f:view>). В компоненте UIForm (<h:form>) имеется компонент UIData (<h:dataTable>), который имеет компонент UIInput (<h:inputText>), который необходимо обработать. updateModel() в основном необходимо поставить представленное, преобразованное и проверенное значение в модели (управляемый bean). Однако эта операция завершилась неудачно, поскольку свойство не доступно для записи (т.е. Метод setter не может быть найден на основе синтаксиса выражения EL).

Хорошо, посмотрим на свойства ваших компонентов <h:inputText> в целом.

<h:inputText value="#{p.getId}"/>
...
<h:inputText value="#{p.getNazwa}" />
...
<h:inputText value="#{p.getNip}" />

Подождите, это странно. Они начинают все с "get"! Это определенно не нормально. Затем JSF ищет методы типа setGetId(), setGetNazwa() и т.д., Которые просто не имеют смысла (и, вероятно, также не имеют, учитывая это исключение). Он ожидал, что они представляют конкретные имена свойств, такие как "id", "nazwa", "nip" и т.д., А не полные имена методов.

Таким образом, так в модели:

private Long id;
private String nazwa;
private String nip;

// Add/generate getters and setters in the following syntax:

public Long getId() {
    return id;
}

public void setId(Long id) {
    this.id = id;
}

// ...

И так в представлении:

<h:inputText value="#{p.id}"/>
...
<h:inputText value="#{p.nazwa}" />
...
<h:inputText value="#{p.nip}" />

Это, однако, уже описано в немного разумной JSF-книге/учебнике/ресурсе. Вы абсолютно уверены, что читаете правильный? Ваш вопрос также показывает, что вы используете JSF 2.0 в сочетании с устаревшей технологией просмотра JSP вместо своих преемников Facelets. Начните с нашей вики-страницы JSF.

Ответ 2

Здесь у вас мало проблем. Во-первых, в ваших входных компонентах у вас есть значения, такие как p.getId. В bean у вас, вероятно, есть методы с именем getId и setId, но это означает, что у вас есть свойство, называемое просто id, которое вы можете читать и писать. Поэтому измените свои значения на: p.id, p.nazwa, p.nip... Вы можете видеть, что я использую все нижние буквы, а не Id, но id.

Во-вторых, вы должны изменить свой метод действий на что-то вроде этого (если вы хотите перенаправить):

public String redirect() {
  return "dodaj_pr?faces-redirect=true";
}

и тег кнопки команды примерно так:

<h:commandButton action="#{producentBean.redirect}" value="Dodaj" />

Ответ 3

У меня была такая же ошибка. Ошибка состояла в том, что в свойстве value входного текста в EL были пробелы между} и ", как показано ниже.

<h:inputText id="txtNroOficio" value="# {bean.nombre}  "   />

Я удалил пустые места, и это сработало.

Ответ 4

Не указывайте() в своей командной кнопке. В вашем методе bean верните некоторую строку и используйте навигацию для перехода на другую страницу.