【问题标题】:"PropertyNotWritableException: Illegal Syntax for Set Operation" error when setting value in bean [duplicate]在bean中设置值时出现“PropertyNotWritableException:设置操作的非法语法”错误[重复]
【发布时间】:2017-03-27 07:17:35
【问题描述】:

我在尝试将一些值从 jsf 页面发送到 bean 时收到此错误。

我想为 bean 中的字段设置值,然后创建一个 Airplane 实例并将其添加到我的数据库中。但是我收到一个错误,告诉我我对 bean 的 setter 部分使用了非法语法。

为什么会出现这个错误?我在这个网站上没有找到任何可以帮助我解决问题的东西。

这里是jsf部分:

<h4>Add A Plane</h4>

                <c:if test="#{not empty listAirplaneBB.error}">
                    <div class="alert alert-danger">
                        <span class="glyphicon glyphicon-remove"></span> <h:outputText value="#{listAirplaneBB.error}" />
                    </div>
                </c:if>
                <h:form>
                <table class="table">
                    <thead>
                        <tr>
                            <th>Plane Make</th>
                            <th colspan="1">Plane Model</th>
                            <th colspan="1">Plane Seats</th>
                        </tr>
                    </thead>
                    <tr>    
                        <td>  
                            <h:inputText value="#{addAirplaneCtrl.setMake(make)}">
                                <f:validateLength minimum="3" />
                            </h:inputText>
                        </td>
                        <td>
                            <h:inputText id="lastname" value="#{addAirplaneCtrl.setModel(model)}">
                                <f:validateLength minimum="3" />
                            </h:inputText>
                        </td>
                        <td>
                            <h:inputText value="#{addAirplaneCtrl.setSeats(seats)}">
                                <f:validateLength minimum="1" />
                            </h:inputText>
                        </td>
                        <td>
                            <h:commandButton value="Add Plane" class="btn btn-primary" action="#{addAirplaneCtrl.addPlane()}" />
                        </td>
                    </tr>
                </table>
                </h:form>

这是豆子:

@Named
@RequestScoped
public class AddAirplaneCtrl implements Serializable{

@Inject
private FlightModel flightModel;

private ListAirplaneBB listAirplaneBB;

private String make; 
private String model; 
private String seats;

private static final String PLANE_EXIST = "Plane already exists";
private static final String EMPTY_FIELDS = "Please fill in all fields";

protected AddAirplaneCtrl(){
    ;
}

/*
TO DO LIST
    error handling
*/

public String addPlane(){

    //make sure all fields are filled, otherwise set error and return redirect false
    if(make == null || model == null || seats == null){
        listAirplaneBB.setError(EMPTY_FIELDS);
        return "/private/admin/admincenter?faces-redirect=false";
    }

    //create planeId
    String pId = make.substring(0, 1);
    pId += model;

    //upload photo in new method [Meet requirements, rename photoID planeId, upload to folder]

    //check if exist
    List<Airplane> airplaneList = flightModel.getAirplaneList().getByAirplaneId(pId);
    if(!airplaneList.isEmpty()){
        listAirplaneBB.setError(PLANE_EXIST);
        return "/private/admin/admincenter?faces-redirect=false";
    }

    //add plane
    Airplane airplane = new Airplane(make, model, pId, seats);
    flightModel.getAirplaneList().create(airplane);
    return "/private/admin/admincenter?faces-redirect=true";
}

public String deleteAirplane(String planeId){
    return "";
}

/**
 * @param make the make to set
 */
public void setMake(String make) {
    this.make = make;
}

/**
 * @param model the model to set
 */
public void setModel(String model) {
    this.model = model;
}

/**
 * @param seats the seats to set
 */
public void setSeats(String seats) {
    this.seats = seats;
}

}

这是错误:

javax.faces.component.UpdateModelException: javax.el.PropertyNotWritableException: /private/admin/admincenter.xhtml @118,87 value="#{addAirplaneCtrl.setMake(make)}": 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.UIForm.processUpdates(UIForm.java:281)
at javax.faces.component.UIComponentBase.processUpdates(UIComponentBase.java:1286)
at javax.faces.component.UIComponentBase.processUpdates(UIComponentBase.java:1286)
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:646)
at org.apache.catalina.core.StandardWrapper.service(StandardWrapper.java:1682)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:344)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:214)
at edu.cth.dzenkyair.frontend.auth.AdminFilter.doFilter(AdminFilter.java:40)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:256)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:214)
at edu.cth.dzenkyair.frontend.auth.UserFilter.doFilter(UserFilter.java:39)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:256)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:214)
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:316)
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:160)
at org.apache.catalina.core.StandardPipeline.doInvoke(StandardPipeline.java:734)
at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:673)
at com.sun.enterprise.web.WebPipeline.invoke(WebPipeline.java:99)
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:174)
at org.apache.catalina.connector.CoyoteAdapter.doService(CoyoteAdapter.java:415)
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:282)
at com.sun.enterprise.v3.services.impl.ContainerMapper$HttpHandlerCallable.call(ContainerMapper.java:459)
at com.sun.enterprise.v3.services.impl.ContainerMapper.service(ContainerMapper.java:167)
at org.glassfish.grizzly.http.server.HttpHandler.runService(HttpHandler.java:201)
at org.glassfish.grizzly.http.server.HttpHandler.doHandle(HttpHandler.java:175)
at org.glassfish.grizzly.http.server.HttpServerFilter.handleRead(HttpServerFilter.java:235)
at org.glassfish.grizzly.filterchain.ExecutorResolver$9.execute(ExecutorResolver.java:119)
at org.glassfish.grizzly.filterchain.DefaultFilterChain.executeFilter(DefaultFilterChain.java:284)
at org.glassfish.grizzly.filterchain.DefaultFilterChain.executeChainPart(DefaultFilterChain.java:201)
at org.glassfish.grizzly.filterchain.DefaultFilterChain.execute(DefaultFilterChain.java:133)
at org.glassfish.grizzly.filterchain.DefaultFilterChain.process(DefaultFilterChain.java:112)
at org.glassfish.grizzly.ProcessorExecutor.execute(ProcessorExecutor.java:77)
at org.glassfish.grizzly.nio.transport.TCPNIOTransport.fireIOEvent(TCPNIOTransport.java:561)
at org.glassfish.grizzly.strategies.AbstractIOStrategy.fireIOEvent(AbstractIOStrategy.java:112)
at org.glassfish.grizzly.strategies.WorkerThreadIOStrategy.run0(WorkerThreadIOStrategy.java:117)
at org.glassfish.grizzly.strategies.WorkerThreadIOStrategy.access$100(WorkerThreadIOStrategy.java:56)
at org.glassfish.grizzly.strategies.WorkerThreadIOStrategy$WorkerThreadRunnable.run(WorkerThreadIOStrategy.java:137)
at org.glassfish.grizzly.threadpool.AbstractThreadPool$Worker.doWork(AbstractThreadPool.java:565)
at org.glassfish.grizzly.threadpool.AbstractThreadPool$Worker.run(AbstractThreadPool.java:545)
at java.lang.Thread.run(Thread.java:745)
Caused by: javax.el.PropertyNotWritableException: /private/admin/admincenter.xhtml @118,87 value="#{addAirplaneCtrl.setMake(make)}": 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)
... 45 more
Caused by: javax.el.PropertyNotWritableException: Illegal Syntax for Set Operation
at com.sun.el.parser.AstValue.setValue(AstValue.java:228)
at com.sun.el.ValueExpressionImpl.setValue(ValueExpressionImpl.java:294)
at org.jboss.weld.el.WeldValueExpression.setValue(WeldValueExpression.java:64)
at com.sun.faces.facelets.el.TagValueExpression.setValue(TagValueExpression.java:131)
... 46 more

【问题讨论】:

  • 您不需要从 jsp 页面调用 setter 方法。而是将其用于所有字段。 value="#{addAirplaneCtrl.make}"
  • @Jobin 我无法访问这些字段,我该怎么办?将它们公开还是有其他方法?

标签: jsf jsf-2


【解决方案1】:

JSF 使用 ManagedBeans,托管 bean 使用 bean 标准,即实现可序列化、封装和空构造函数

facelets 可以通过表达式语言与托管 bean 进行通信,并将 setter 与任何 EditableValueHolder UIComponent 一起使用。

在您的情况下,您使用的 EditableValueHolder&lt;h:inputText /&gt; 组件,当您使用 value="" 属性时,调用设置器的正确方法是只使用您尝试设置的属性,这是一个示例:

豆:

@Named or @ManageBean
@some_scope
public class YourBean implements Serializable{

private String make;

public void setMake(String make){
  this.make = make;
} 

public String getMake(){
  return this.make;
}

}

小脸:

// will call the setMake(String make)  method
<h:inputText value="#{yourBean.make}" />

// will call the getMake() method 
<h:outputText value="#{yourBean.make}" />

【讨论】:

    【解决方案2】:

    表达式语言不需要写“set”描述,只需要写

    &lt;h:inputText value="#{addAirplaneCtrl.make}"&gt;

    然后jsf会在提交时尝试在你的bean上找到setMake方法,因为你把它放在一个inputText组件上。

    【讨论】:

      猜你喜欢
      • 2017-02-01
      • 2012-11-20
      • 2015-04-23
      • 2020-05-16
      • 1970-01-01
      • 2012-12-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多