javax.el.PropertyNotWritableException: /index.xhtml @29,118 value="": Illegal Syntax for Set Operation

Body picture Body · Apr 6, 2013 · Viewed 13.3k times · Source

I want to create a login screen with localization option to translate the name and when i change from the default English to Arabic it crash

here is the faces.config.xml

<?xml version="1.0" encoding="UTF-8"?>
<faces-config
    xmlns="http://java.sun.com/xml/ns/javaee"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://java.sun.com/xml/ns/javaee 
    http://java.sun.com/xml/ns/javaee/web-facesconfig_2_0.xsd"
    version="2.0">
     <application>
           <locale-config>
                <default-locale>en</default-locale>
                <supported-locale>ar</supported-locale>
           </locale-config>
       <resource-bundle>
        <base-name>mypack.enar</base-name>
        <var>msg</var>
       </resource-bundle>
     </application>
</faces-config>

ManagedBean

import java.io.Serializable;
import java.util.LinkedHashMap;
import java.util.Locale;
import java.util.Map;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.RequestScoped;
import javax.faces.context.FacesContext;
import javax.faces.event.ValueChangeEvent;

/**
 *
 * @author body
 */
@ManagedBean(name = "localize")
@RequestScoped
public class LocalizeMBean implements Serializable {

    /**
     * @return the countries
     */
    public static Map<String, Object> getCountries() {
        return countries;
    }

    /**
     * @param aCountries the countries to set
     */
    public static void setCountries(Map<String, Object> aCountries) {
        countries = aCountries;
    }

    private String localeCode;

    /**
     * Creates a new instance of LocalizeMBean
     */
    public void setLocaleCode(String localeCode) {
        this.localeCode = localeCode;
    }

    public Map<String, Object> getCountriesInMap() {
        return getCountries();
    }

    public String getLocaleCode() {
        return localeCode;
    }
    private static Map<String, Object> countries;

    static {
        setCountries(new LinkedHashMap<String, Object>());
        getCountries().put("English", Locale.ENGLISH); //label, value
        getCountries().put("Arabic", Locale.UNICODE_LOCALE_EXTENSION);
    }

    public void countryLocaleCodeChanged(ValueChangeEvent e) {

        String newLocaleValue = e.getNewValue().toString();

        //loop country map to compare the locale code
        for (Map.Entry<String, Object> entry : getCountries().entrySet()) {

            if (entry.getValue().toString().equals(newLocaleValue)) {

                FacesContext.getCurrentInstance()
                        .getViewRoot().setLocale((Locale) entry.getValue());

            }
        }
    }
}

JSF page

<h:head>
        <title>My Login Page</title>
        <h:outputStylesheet library="mycss" name="login-box.css"/>
    </h:head>
    <h:body>
        <h:form>
            <div style="padding: 100px 0 0 250px;">


                <div id="login-box">

                    <H2>Login</H2>
                    My Login Screen
                    <br />
                    <h:selectOneMenu value="#{localize.localeCode}" onchange="submit();"
                                     valueChangeListener="#{localize.countryLocaleCodeChanged}">
                        <f:selectItems value="#{localize.countriesInMap}" /> 
                    </h:selectOneMenu>
                    <br />
                    <div id="login-box-name" style="margin-top:20px;">
                        <h:outputLabel value="#{msg.namee}" />
                    </div>
                    <div id="login-box-field" style="margin-top:20px;">
                        <h:inputText  styleClass="form-login" title="Username" value="" size="30" maxlength="2048" />
                    </div>
                    <div id="login-box-name">Password:</div><div id="login-box-field"><h:inputSecret styleClass="form-login" title="Password" value="" size="30" maxlength="2048" /></div>
                    <br />
                    <div class="login-box-options"><h:selectBooleanCheckbox value="1"/>Remember me<h:commandLink style="margin-left:30px;" value="Forget Password"/></div>
                    <br />
                    <br />
                    <h:commandButton styleClass="button"/>
                </div>
            </div>
        </h:form>
    </h:body>
</html>

The Exception when i change in the combobox

javax.faces.component.UpdateModelException: javax.el.PropertyNotWritableException: /index.xhtml @29,118 value="": 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.UIForm.processUpdates(UIForm.java:281)
    at javax.faces.component.UIComponentBase.processUpdates(UIComponentBase.java:1242)
    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)
    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.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:343)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:217)
    at org.netbeans.modules.web.monitor.server.MonitorFilter.doFilter(MonitorFilter.java:393)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:256)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:217)
    at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:279)
    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.el.PropertyNotWritableException: /index.xhtml @29,118 value="": Illegal Syntax for Set Operation
    at com.sun.faces.facelets.el.TagValueExpression.setValue(TagValueExpression.java:136)
    at javax.faces.component.UIInput.updateModel(UIInput.java:818)
    ... 38 more

Answer

BalusC picture BalusC · Apr 6, 2013

Please carefully read the exception message. The answer is straight in there.

javax.el.PropertyNotWritableException: /index.xhtml @29,118 value="": Illegal Syntax for Set Operation

At line 29, character 118 of /index.xhtml you've a value="". This is not a valid syntax for an EL value expression which should be writable through a setter method.

Normally, you specify the value attribute like so value="#{bean.property}" wherein the bean has a getProperty() and a setProperty() method conform javabeans specification.

It's likely this one:

<h:inputText  styleClass="form-login" title="Username" value="" size="30" maxlength="2048" />

I'm not sure why you specified the value like that. This is plain wrong. You should either remove it altogether

<h:inputText  styleClass="form-login" title="Username" size="30" maxlength="2048" />

or bind it to a valid bean property

<h:inputText  styleClass="form-login" title="Username" value="#{someBean.userName}" size="30" maxlength="2048" />

Please note that this problem has nothing to do with changing the JSF locale.


Unrelated to the concrete problem, nesting forms is illegal in HTML and therefore also in JSF. You should split the language selection and the user login over 2 separate forms. You don't want to submit the login data when you change the language. Further, you may find the hints in this answer helpful as to how to properly change the JSF locale: Localization in JSF, how to remember selected locale per session instead of per request/view