gpt4 book ai didi

jsf - 反对具有静态 WeakHashMap 的通用 JSF 对象转换器的参数

转载 作者:行者123 更新时间:2023-12-04 18:39:17 25 4
gpt4 key购买 nike

我想避免创建 SelectItems 列表以在 View 和模型之间映射我的实体/dto 的样板代码,所以我使用了这个 snippet通用对象转换器:

@FacesConverter(value = "objectConverter")
public class ObjectConverter implements Converter {

private static Map<Object, String> entities = new WeakHashMap<Object, String>();

@Override
public String getAsString(FacesContext context, UIComponent component, Object entity) {
synchronized (entities) {
if (!entities.containsKey(entity)) {
String uuid = UUID.randomUUID().toString();
entities.put(entity, uuid);
return uuid;
} else {
return entities.get(entity);
}
}
}

@Override
public Object getAsObject(FacesContext context, UIComponent component, String uuid) {
for (Entry<Object, String> entry : entities.entrySet()) {
if (entry.getValue().equals(uuid)) {
return entry.getKey();
}
}
return null;
}

}

已经有很多 answers对于类似的问题,但我想要一个普通的解决方案(没有 *faces)。以下几点仍然让我不确定我的片段的质量:
  • 如果就这么简单,为什么 JSF 中没有内置通用对象转换器? ?
  • 为什么这么多人还在用SelectItems ?使用通用方法不是有更多的灵 active 吗?例如。 #{dto.label} 可以快速更改为#{dto.otherLabel}。
  • 鉴于范围只是在 View 和模型之间进行映射,通用方法是否有任何主要缺点?
  • 最佳答案

    这种方法很笨拙且内存效率低下。

    在小型应用程序中“可以”,但在具有数万或数十万个潜在实体的大型应用程序中绝对不行,f:selectItems 中可以引用这些实体。 .而且,这么大的应用程序一般都有二级实体缓存。 WeakHashMap然后变得无用并且仅在从底层数据存储(因此也从二级实体缓存中)物理删除实体时才有效。

    它当然有一个“有趣”的因素,但我真的不建议在“大量生产”中使用它。

    如果您不想使用实用程序库中的现有解决方案,例如 OmniFaces SelectItemsConverter 正如您已经发现的那样,它基本上是完全无状态的并且不使用任何 DAO/Service 调用,那么您最好的选择是使用一个通用的基本接口(interface)/类来抽象您的所有实体,然后将转换器卡在上面。这只仍然需要一个 DAO/Service 调用。这已在此问答中详细说明:Implement converters for entities with Java Generics .

    关于jsf - 反对具有静态 WeakHashMap 的通用 JSF 对象转换器的参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30186849/

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