我试图获得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
答案 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。