gpt4 book ai didi

jsf - Primefaces 选项列表。 DualListModel 的 Setter 删除源和目标

转载 作者:行者123 更新时间:2023-12-04 14:42:44 26 4
gpt4 key购买 nike

我的选择列表有问题。显示源和目标有效,但是当按下命令按钮时,它会调用选项列表的 setter 并清空选项列表的源和目标。之后它调用方法connectTags()。

这种行为的原因是什么,我该如何解决?

<h:form>
<p:pickList id="pickList" value="#{employeeEditController.dualListTags}"
var="tag" itemLabel="#{tag.value}" itemValue="#{tag}">
<f:facet name="sourceCaption">Available</f:facet>
<f:facet name="targetCaption">Connected</f:facet>
</p:pickList>
<p:commandButton value="Save" actionListener="#{employeeEditController.connectTag()}"/>
</h:form>

bean 角,扁 bean :
@Named(value = "employeeEditController")
@SessionScoped
public class EmployeeEditController implements Serializable, IEditController {
private Employee selectedEmployee;
private DualListModel<Tags> dualListTags;

@Inject
private EmployeeFacade employeeFacade;
@Inject
private CompanyFacade companyFacade;
@Inject
private TagFacade tagFacade;

public void setSelectedEmployee(Employee selectedEmployee) {
System.out.println("setSelectedEmployee called. Value: " + selectedEmployee.getFirstName());
this.selectedEmployee = selectedEmployee;
this.refreshDualList();
}

private void refreshDualList(){
List<Tags> source = (List<Tags>) this.getCompanyTags();
List<Tags> target = (List<Tags>) this.getTags();
System.out.println("refreshDualList called. \nSource: " + source.size() +
"Target: " + target.size());
this.dualListTags = new DualListModel<Tags>(source, target);
}

public Collection<Tags> getTags(){
Collection<Tags> retVal;
if(this.selectedEmployee != null){
retVal = this.selectedEmployee.getTags();
if(retVal == null){
retVal = new ArrayList<Tags>();
}
} else{
System.out.println("selected emp is null");
retVal = new ArrayList<Tags>();
}
return retVal;
}

public Collection<Tags> getCompanyTags() {
Collection<Tags> retVal = new ArrayList<Tags>();
if(this.companyID == null){
String userstr = FacesContext.getCurrentInstance().getExternalContext().getRemoteUser();
this.companyID = this.companyFacade.getCompanyIDByUser(userstr);
}
retVal = this.tagFacade.getTagsFromCompanyID(companyID);
return retVal;
}

public void save(){
if(this.selectedEmployee != null){
System.out.println("Save called. Value: " + this.selectedEmployee.getFirstName());
this.employeeFacade.edit(this.selectedEmployee);
}
}

public void connectTag() {
if(this.dualListTags != null){
System.out.println("connectTag() called.\n" + "source: " + this.dualListTags.getSource().size() +
"\ntarget: " + this.dualListTags.getTarget().size());
this.selectedEmployee.setTags((Collection<Tags>)this.dualListTags.getTarget());
this.save();
}
}

public DualListModel<Tags> getDualListTags() {
System.out.println("getDualList called. \nSource :" + this.dualListTags.getSource().size()
+ "\nTargets: " + this.dualListTags.getTarget().size());
return this.dualListTags;
}

public void setDualListTags(DualListModel<Tags> dualListTags) {
System.out.println("setDualList called. \nSource :" + this.dualListTags.getSource().size()
+ "\nTargets: " + this.dualListTags.getTarget().size());
this.dualListTags = dualListTags;
System.out.println("setDualList called after set. \nSource :" + this.dualListTags.getSource().size()
+ "\nTargets: " + this.dualListTags.getTarget().size());
}

}

最佳答案

我遇到了同样的问题,似乎解决方案是为您在选择列表中使用的实体实现自定义转换器。

这是我的自定义转换器的样子:

@ViewScoped
@ManagedBean(name = "vehicleGroupConverter")
public class VehicleGroupConverter implements Converter {

@ManagedProperty(value = "#{vehiclesBean}")
private VehiclesBean vehiclesBean;

@Override
public Object getAsObject(FacesContext context, UIComponent component,
String value) {
long groupId = Long.parseLong(value);
List<AssetCategory> groups = vehiclesBean.getVehicleGroups();
for (AssetCategory group : groups) {
if (group.getCategoryId() == groupId) {
return group;
}
}
return null;
}

@Override
public String getAsString(FacesContext context, UIComponent component,
Object value) {
return Long.toString(((AssetCategory) value).getCategoryId());
}

public void setVehiclesBean(VehiclesBean vehiclesBean) {
this.vehiclesBean = vehiclesBean;
}

}

这是选项列表模板部分:
<p:pickList id="vehicleGroups" 
value="#{vehiclesBean.selectedVehicleGroups}"
var="group"
itemLabel="#{group.name}"
itemValue="#{group}"
converter="#{vehicleGroupConverter}"
styleClass="pf-panel-grid"
style="margin-bottom:10px">
<f:facet name="sourceCaption">#{i18n['label-available-groups']}</f:facet>
<f:facet name="targetCaption">#{i18n['label-assigned-groups']}</f:facet>
</p:pickList>

关于jsf - Primefaces 选项列表。 DualListModel 的 Setter 删除源和目标,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10789967/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com