javax.el.PropertyNotWritableException:/index.xhtml @ 29,118 value =“”:集合操作的非法语法

时间:2013-04-06 02:48:17

标签: java jsf-2 properties localization resourcebundle

我想创建一个带有本地化选项的登录屏幕来翻译名称,当我从默认英语更改为阿拉伯语时崩溃

这是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页面

<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>

我改变组合框时的异常

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

1 个答案:

答案 0 :(得分:12)

请仔细阅读异常消息。答案就在那里。

  

javax.el.PropertyNotWritableException:/index.xhtml @ 29,118 value =“”:设置操作的非法语法

在第29行,/index.xhtml的字符118您有value=""。这不是EL值表达式的有效语法,它应该可以通过setter方法写入。

通常,您指定value属性,如value="#{bean.property}",其中bean具有getProperty()setProperty()方法符合javabeans规范。

可能是这个:

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

我不确定你为什么指定这样的值。这是完全错误的。您应该完全删除它

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

或将其绑定到有效的bean属性

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

请注意,此问题与更改JSF区域设置有关。


对于具体问题

无关,嵌套表单在HTML中为illegal,因此也在JSF中。您应该通过2个单独的表单拆分语言选择和用户登录。更改语言时,您不想提交登录数据。此外,您可能会发现此答案中的提示有助于如何正确更改JSF区域设置:Localization in JSF, how to remember selected locale per session instead of per request/view