gpt4 book ai didi

jsf - 通过缓存数据客户端来避免转换器类的 getAsObject 方法中的额外数据库读取?

转载 作者:行者123 更新时间:2023-12-04 18:48:59 27 4
gpt4 key购买 nike

我在 autocomplete 输入元素中显示了建议项目列表。为此,我需要实现 converterentity<entityName, entityId> 转换为 entityName,反之亦然。但是,在实现时,我意识到我必须多次读取数据库才能找到所选实体名称的相应实体 ID(而 getAsObject() ),我想知道为什么不将其存储在客户端某处以便可以传递 entityId选择entityname时。

有什么办法可以避免这种额外的阅读吗?

最佳答案

这确实是“设计使然”,并且可能是 JSF 规范中的一个小疏忽。理论上,您可以通过从 UIComponent 中提取项目来完全避免它。争论并与他们进行比较。然而,这有点工作。我的同事 Arjan Tijms 写了一篇关于此的博客:Automatic to-Object conversion in JSF selectOneMenu & Co.

这是相关性的摘录;以下是您需要扩展的基本转换器:

public abstract class SelectItemsBaseConverter implements Converter {
@Override
public Object getAsObject(FacesContext context, UIComponent component, String value) {
return SelectItemsUtils.findValueByStringConversion(context, component, value, this);
}
}

这是 SelectItemsUtils部分从 Mojarra 的来源复制的类:
public final class SelectItemsUtils {

private SelectItemsUtils() {}

public static Object findValueByStringConversion(FacesContext context, UIComponent component, String value, Converter converter) {
return findValueByStringConversion(context, component, new SelectItemsIterator(context, component), value, converter);
}

private static Object findValueByStringConversion(FacesContext context, UIComponent component, Iterator<SelectItem> items, String value, Converter converter) {
while (items.hasNext()) {
SelectItem item = items.next();
if (item instanceof SelectItemGroup) {
SelectItem subitems[] = ((SelectItemGroup) item).getSelectItems();
if (!isEmpty(subitems)) {
Object object = findValueByStringConversion(context, component, new ArrayIterator(subitems), value, converter);
if (object != null) {
return object;
}
}
} else if (!item.isNoSelectionOption() && value.equals(converter.getAsString(context, component, item.getValue()))) {
return item.getValue();
}
}
return null;
}

public static boolean isEmpty(Object[] array) {
return array == null || array.length == 0;
}

/**
* This class is based on Mojarra version
*/
static class ArrayIterator implements Iterator<SelectItem> {

public ArrayIterator(SelectItem items[]) {
this.items = items;
}

private SelectItem items[];
private int index = 0;

public boolean hasNext() {
return (index < items.length);
}

public SelectItem next() {
try {
return (items[index++]);
}
catch (IndexOutOfBoundsException e) {
throw new NoSuchElementException();
}
}

public void remove() {
throw new UnsupportedOperationException();
}
}
}

这是你应该如何将它用于你自己的转换器,你只需要实现 getAsString() ( getAsObject() 已经处理了):
@FacesConverter("someEntitySelectItemsConverter")
public class SomeEntitySelectItemsConverter extends SelectItemsBaseConverter {

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

更新 上述概念已在 JSF 实用程序库中结束 OmniFaces以下转换器的味道:
  • SelectItemsConverter - 对于 <f:selectItem(s)>基于 Object#toString() .
  • SelectItemsIndexConverter - 对于 <f:selectItem(s)>基于项目的索引。
  • ListConverter - 例如<p:autoComplete>基于 Object#toString()
  • ListIndexConverter - 例如<p:autoComplete>基于项目的索引。
  • 关于jsf - 通过缓存数据客户端来避免转换器类的 getAsObject 方法中的额外数据库读取?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9147119/

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