我有一个基于LazyDataModel的Primeface DataTable。我成功地在表中加载了数据,但我无法使用setProperty tyActionListener在对话框中显示选定的项目,也无法编辑行。我正在使用请求范围,我注意到这个问题似乎在会话范围内得到解决,但我宁愿使用前者(视图范围甚至不会在表中加载数据)。我已经尝试覆盖getRowData和getRowKey方法,但它们甚至没有被调用。当我不使用惰性模型方法时,我没有这些问题。
这可能是我缺少的注入相关问题,或者LazyDataModel无法在会话范围之外工作?
public class LazyDataModelBase<T> extends LazyDataModel<T> {
private volatile AbstractFacade<T> facade;
public LazyDataModelBase(AbstractFacade<T> facade) {
super();
this.facade = facade;
}
public final AbstractFacade<T> getFacade() {
return facade;
}
public final void setFacade(AbstractFacade<T> facade) {
this.facade = facade;
}
@Override
public List<T> load(int first, int pageSize, String sortField,
SortOrder sortOrder, Map<String, String> filters) {
List<T> list = facade.load(first, pageSize,
sortField, sortOrder, filters);
if (list == null) {
throw new RuntimeException("Problem.");
}
// I am using the following line for debugging:
// throw new RuntimeException(list.toString());
setRowCount(facade.count());
return list;
}
}
UserLazyDataModel看起来像这样
public class UserLazyDataModel extends LazyDataModelBase<User> {
private UserFacade facade;
public UserLazyDataModel(UserFacade facade) {
super(facade);
}
public List<User> getRowData(String rowKey) {
return facade.findById(Integer.parseInt(rowKey)); // findById as defined in UserFacade
}
...
我的背豆是这样的
@Named(value = "userController")
@RequestScoped
public class UserController implements Serializable {
private User current;
@EJB
private UserFacade ejbFacade;
private LazyDataModelBase<User> items;
private Integer itemId;
private int pageSize = 10;
public UserController() {
items = new UserLazyDataModel(ejbFacade);
}
public UserFacade getUserFacade() {
return ejbFacade;
}
public void setUserFacade(UserFacade facade) {
this.ejbFacade = facade;
//items.setFacade(facade);
}
public User getSelected() {
if (current == null) {
this.current = new User();
}
return current;
}
public void setSelected(User selected) {
this.current = selected;
}
public void setSelected(Integer id) {
this.itemId = id;
current = ejbFacade.find(id);
}
public Integer getItemId() {
return itemId;
}
public void setItemId(Integer id) {
this.itemId = id;
current = ejbFacade.findById(id);
}
public int getPageSize() {
return pageSize;
}
public void setPageSize(int pageSize) {
this.pageSize = pageSize;
}
private void setDefaultStatus() {
current.setStatusId(ejbFacade.getDefaultStatus());
}
public String create() {
current.setDateCreated(new Date());
if (current.getStatusId() == null) {
setDefaultStatus();
}
current.hashPassword();
try {
ejbFacade.create(current);
JsfUtil.addSuccessMessage("User guardado exitosamente");
return "success-create";
} catch (Exception e) {
JsfUtil.addErrorMessage(e, "A persistence error ocurred.");
return null;
}
}
public String prepareList() {
//current = null;
return "index?faces-redirect=true";
}
public String prepareCreate() {
return "create?faces-redirect=true";
}
public String prepareEdit() {
return "edit";
}
public void onRowSelect() {
current = ejbFacade.findById(itemId);
}
public void update() {
try {
ejbFacade.edit(current);
JsfUtil.addSuccessMessage("User guardado exitosamente");
} catch (Exception e) {
JsfUtil.addErrorMessage(e, "A persistence error ocurred.");
}
}
public void delete() {
try {
ejbFacade.remove(current);
current = null;
JsfUtil.addSuccessMessage("role deleted");
} catch (Exception e) {
JsfUtil.addErrorMessage(e, ResourceBundle.getBundle("/Bundle").getString("PersistenceErrorOccured"));
}
}
public LazyDataModelBase<User> getItems() {
items.setFacade(ejbFacade);
items.setPageSize(pageSize);
return items;
}
public void setItems(LazyDataModelBase<User> model) {
this.items = model;
}
}
这是我的观点
<h:form prependId="false">
<p:commandButton immediate="true" style="margin: 10px 0;" value="Nuevo" icon="ui-icon-plus" action="#{userController.prepareCreate}" ajax="false" />
</h:form>
<h:form id="listForm">
<br />
<p:growl id="messages" showDetail="true"/>
<p:dataTable var="item" value="#{userController.items}" rows="#{userController.pageSize}"
lazy="true" selectionMode="single" rowKey="#{item.userId}" selection="#{userController.selected}"
paginator="true" id="itemsTable" rowsPerPageTemplate="10,30,50">
<p:ajax event="rowSelect" listener="#{userController.onRowSelect}" update=":listForm:itemDisplay" oncomplete="itemDialog.show()" />
<p:column headerText="ID" id="userId" sortBy="#{item.userId}" style="width: 10px;">
#{item.userId}
</p:column>
<p:column headerText="First Name" id="first-name" sortBy="#{item.firstName}">
#{item.firstName}
</p:column>
<p:column headerText="Last Name" id="last-name" sortBy="#{item.lastName}">
#{item.lastName}
</p:column>
<p:column headerText="Email" id="email" sortBy="#{item.email}" filterBy="#{item.email}">
#{item.email}
</p:column>
<p:column headerText="User" id="name" sortBy="#{item.username}">
#{item.username}
</p:column>
<p:column headerText="birthdate" id="birthdate" sortBy="#{item.birthdate}">
<h:outputText value="#{item.birthdate}" >
<f:convertDateTime type="date" pattern="yyyy/MM/dd"/>
</h:outputText>
</p:column>
<p:column headerText="role" id="status" sortBy="#{item.statusId.name}">
#{item.statusId.name}
</p:column>
<p:column style="width:32px;">
<h:panelGrid columns="3" class="datarow-icons">
<p:commandButton icon="ui-icon-trash" update=":listForm:itemsTable :listForm:confirmDelete"
oncomplete="deleteDialog.show()">
<f:setPropertyActionListener value="#{item}" target="#{userController.selected}" />
</p:commandButton>
<p:commandButton icon="ui-icon-pencil" immediate="true" action="#{userController.prepareEdit}" ajax="false">
<f:setPropertyActionListener value="#{item}" target="#{userController.selected}" />
</p:commandButton>
<p:commandButton id="select-button"
update=":listForm:itemDisplay"
oncomplete="itemDialog.show()" icon="ui-icon-search"
title="view" >
<f:setPropertyActionListener value="#{item}" target="#{userController.selected}" />
</p:commandButton>
</h:panelGrid>
</p:column>
</p:dataTable>
<p:dialog widgetVar="itemDialog" resizable="false"
showEffect="explode" hideEffect="explode" header="Item Detail">
<p:panelGrid columns="2" id="itemDisplay" style="width: 250px;">
<h:outputText value="ID: " />
<h:outputText value="#{userController.selected.userId}" />
<h:outputText value="Name: " />
<h:outputText value="#{userController.selected.username}" />
<h:outputText value="Description: " />
<h:outputText value="#{userController.selected.firstName}" />
</p:panelGrid>
</p:dialog>
<p:confirmDialog id="confirmDelete" header="Confirm delete"
widgetVar="deleteDialog" severity="alert"
showEffect="fade" hideEffect="fade"
closable="false"
message="¿Realmente desea borrar '#{userController.selected.toString()}' ?">
<p:commandButton id="decline" value="Not Yet"
onclick="deleteDialog.hide();" type="button" />
<p:commandButton id="accept" value="Confirmar"
update=":listForm"
oncomplete="deleteDialog.hide();"
action="#{userController.delete}" ajax="false">
</p:commandButton>
</p:confirmDialog>
</h:form>
我设法通过在我的UserLazyDataModel(我显示的LazyDataModelBase的子类)中重写getRowData来使rowSelect工作,如下所示:
@Override
public User getRowData(String rowKey) {
try {
return ((UserFacade) getFacade()).findById(Integer.parseInt(rowKey));
} catch (Exception e) {
return null;
}
}
并删除
rowkey="#{item.userId}"
来自dataTable声明的属性。我在子类UserLazyDataModel中声明了一个facade,默认情况下这与父类LazyDataModelBase不同(设置为null)。解决方案是从子类中删除此字段并通过getFacade方法访问父字段,最终将其转换为UserFacade。
setPropertyActionListener尚未工作。
我正在构建一个VueJS应用程序,并使用JSON web令牌作为身份验证系统。当我登录用户时,我使用localStorage存储令牌,并且工作正常。我检查了标题,它在“授权”参数中。 我通过 我看到了标题,没关系。但是,当我对API中的受保护路由执行get请求时,返回“unauthorized”。但是,当我在请求中手动传递带有令牌的标头时,效果很好。 有人知道如何在执行某个请求时自动传递头吗?
我制作了一个用于注册成员的jsp页面,在注册时,如果用户忘记填写表单中的任何字段,另一个页面会显示一条错误消息。 为了实现这一点,我使用了3个servlet,第一个servlet从jsp页面获取值,并传递到第二个servlet,后者检查是否有任何字段为空,如果是,它将返回一条消息给第一个servlet,然后将消息传递给第三个servlet,以向用户显示错误消息。 我的问题是消息没有从第一个serv
从WebSocketendpoint,我尝试调用单例服务。但是我无法使用来自WebSocket的请求或会话范围。 谢谢你的帮助!
我编写了一个会话范围的托管bean,用于在domino xpages应用程序中缓存sesion用户特定的信息,如下代码所示: 然后,我在faces配置中声明了它,使其成为会话范围的bean: 在测试bean时,我通过#{NBUser.fullUserName}使用它,它并不总是返回当前domino http会话上下文的用户,例如,我首先由用户“user1”登录并注销,然后由user2登录,bean
无论 Struts2 还是 Spring,都提供了一种控制器: 每次请求,创建实例,使用后即抛弃。 这样的控制器的好处就是可以放心的吧 request 和 response 对象放心的存成它的私有 属性,反正使用一次后就丢掉了。 在 Nutz.Mvc,所谓控制器,实际上就是 Module,默认的,所有的模块都是整个应用程序唯一的, 除非你在 Ioc 配置文件里另有说明。 那么 Nutz 可以做到每
我第一次尝试使用Google Firestore,通过Google api身份验证进行身份验证。我要做的第一件事是用几个方法来填充数据库,当我等待批处理任务时,会出现以下错误: 我几乎找不到谷歌认证连接firestore的方法。首先,我使用google console为我的应用程序提供的密码使用此方法进行身份验证: 使用在我的google控制台中为应用程序配置的相同作用域(我在同一应用程序中使用g