javax.el.PropertyNotFoundException:/tab.xhtml @ 65,50 value ="#{stackElement.name}":class' java.lang.String'没有财产' name'

时间:2015-05-18 06:43:39

标签: jsf primefaces propertynotfoundexception

如果我第一次添加stackElement就可以了,输出为:

  

list size = 1

但是在添加第二个元素后我得到了错误:

  

渲染视图时出错[/tab.xhtml]:javax.el.PropertyNotFoundException:   /tab.xhtml @ 65,50 value ="#{stackElement.name}":班级   ' java.lang.String中'没有财产的名称'。 ...引起:   javax.el.PropertyNotFoundException:类' java.lang.String'不   没有财产'名称'。

     

错误[io.undertow.request](默认任务-4)UT005023:异常   处理/Play/tab.xhtml的请求:java.lang.IllegalStateException:   CDATA标签可能无法嵌套...

为什么会这样?

<h:form>

    <p:commandButton update="stack" value="Use in expression" action="#{bean.tab}">
        <f:param name="i" value="13" />
    </p:commandButton>

    <p:orderList  id="stack" value="#{expression.list}" var="stackElement" 
            itemLabel="#{stackElement}" itemValue="#{stackElement}" controlsLocation="none" >
        <!-- <p:ajax event="reorder" listener="#{expression.onReorder}" /> -->
        <p:column>
            <h:outputText value="#{stackElement.name}" />
        </p:column>
    </p:orderList>

</h:form>

@ManagedBean @RequestScoped 
public class Bean implements Serializable {
    @ManagedProperty(value="#{expression}")
    private Expression ex;
    public void tab() { 
        ex.addStackElement( new StackElement((int) System.currentTimeMillis(), "tab") );
    }
    // getters-setters

@ManagedBean @SessionScoped
public class Expression implements Serializable {
    private List<StackElement> list = new ArrayList<StackElement>();
    public void addStackElement(StackElement stackElement) {
        list.add(stackElement);
        System.out.println("list size = " + list.size()); 
    }
    // getters-setters

模型

public class StackElement {
    private int id;
    private String name;
    public StackElement(int id, String name) {
        this.id = id;
        this.name = name;
    }
    // getters-setters

转换器

@FacesConverter("myConverter")
public class MyConverter implements Converter {

    @Override
    public Object getAsObject(FacesContext fc, UIComponent component, String value) {
        if(value != null && value.trim().length() > 0) {
            try {
                Expression service = (Expression) fc.getExternalContext().getApplicationMap().get("expression");
                return service.getStackElementByName(value);
            } catch(NumberFormatException e) {
                throw new ConverterException(new FacesMessage(FacesMessage.SEVERITY_ERROR, "Conversion Error", "Not a valid element name."));
            }
        }
        else {
            return null;
        }
    }

    @Override
    public String getAsString(FacesContext context, UIComponent component, Object object) {

        if(object != null) {
            return String.valueOf(((StackElement) object).getName());
        }
        else {
            return null;
        }
    }
}

1 个答案:

答案 0 :(得分:0)

您的代码存在一些问题。

  1. 您应该在converter="myConverter"组件上使用<p:orderList>
  2. 表达式bean是SessionScoped。但是你从ApplicationScope获得它。
  3. 将其更改为

    Expression service =(Expression)fc.getExternalContext()。 getSessionMap() .get(&#34; expression&#34;);

    使这些改变成功后。