在类型java.lang.String上找不到属性“login”

时间:2018-03-21 06:46:08

标签: java casting

我试图获得Primefaces的 selectOneMenu 的值,但是它给出了找不到属性的错误。我在 UserBean 类中的方法返回 UserDTO 对象,并且在实体类中登录不是区分大小写,但它仍然发现错误。

UserBean 类;

     public List<UserDTO> getIds() {
        Object[] array = userService.getWrapperData().toArray();
        List<String> values = new ArrayList<String>();
        for (Object temp : array) {
            for (String s : temp.toString().split(",")) {
                if (("id").equals(s.split("=")[0]))
                    values.add(s.split("=")[1]);
            }
        }
        String[] loginVals = new String[ values.size() ];
        values.toArray( loginVals );
        @SuppressWarnings("unchecked")
        List<UserDTO> valuesLogin = (List) values;
        return valuesLogin;
    }

UserDTO 实体类;

@Entity
@Table(name="USERDTO")
public class UserDTO implements Serializable {

private String login;

    public String getLogin() {
        return login;
    }

    public void setLogin(String login) {
        this.login = login;
    }

}

indexDTO.xhtml

<h:body styleClass="login">
        <h:form id="form">
            <p:dataTable var="users" value="#{userBean.users}" paginator="true"
                widgetVar="usersTable" rows="10" sortMode="multiple"
                paginatorTemplate="{RowsPerPageDropdown} {FirstPageLink} {PreviousPageLink} {CurrentPageReport} {NextPageLink} {LastPageLink}"
                rowsPerPageTemplate="5,10,15" selectionMode="single" id="userTable"
                lazy="true">
                <p:column headerText="Id" sortBy="#{users.id}"
                    filterBy="#{users.id}">
                    <f:facet name="filter">
                        <p:selectOneMenu onchange="PF('usersTable').filter()">
                            <f:selectItem itemLabel="Select One" itemValue="#{null}"
                                noSelectionOption="true" />
                            <f:selectItems value="#{userBean.getIds()}" var="userLogin" itemValue="#{userLogin.login}" itemLabel="#{userLogin.login}" />
                        </p:selectOneMenu>
                    </f:facet>
                    <h:outputText value="#{users.id}" />
                </p:column>
            </p:dataTable>
        </h:form>
    </h:body>

错误日志;

javax.el.PropertyNotFoundException: Property 'login' not found on type java.lang.String

2 个答案:

答案 0 :(得分:1)

您正在向List<String>投射List<UserDTO>

List<String> values = new ArrayList<String>();
...
@SuppressWarnings("unchecked")
List<UserDTO> valuesLogin = (List) values;
return valuesLogin;

您需要手动从这些字符串创建UserDTO个对象:

for(String login : values){
  UserDTO dto = new UserDTO();
  dto.setLogin(login);
  valuesLogin.add(dto);
}

此外,如果您要添加构造函数UserDTO(String login),您可以轻松地将values映射到valuesLogin

valuesLogin = values.stream().map(UserDTO::new).collect(Collectors.toList());

答案 1 :(得分:0)

我以一种非常奇怪的方式解决了我的问题。

我将UserBean方法更改为此;

    public List<UserDTO> getIds() {
        return userService.getWrapperData();
    }

之后我可以从 indexDTO.xhtml 中提取ID。