当前位置: 首页 > 知识库问答 >
问题:

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

牛骞仕
2023-03-14

我想避免使用锅炉板代码来创建SelectItems列表,以便在视图和模型之间映射实体/DTO,因此我使用了通用对象转换器的以下代码片段:

@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;
}

}

类似的问题已经有很多答案了,但我想要一个普通的解决方案(没有*脸)。以下几点仍然让我无法确定我的代码片段的质量:

  1. 如果这么简单,为什么JSF中没有一个通用的对象转换器呢

共有1个答案

桓风史
2023-03-14

这种方法是杂乱无章的,内存效率低下。

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

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

如果您不想使用OmniFacesSelectItemsConverter等实用程序库中的现有解决方案,它基本上是完全无状态的,不使用任何DAO/服务调用,那么最好是用一个公共基接口/类来抽象所有实体,并将转换器挂接在上面。这仍然只需要DAO/服务调用。这一点在本Q中得到了详细阐述

 类似资料:
  • 我为jsf创建了一个自定义转换器。getAsObject()工作正常,但getAsString()返回异常。我不确定问题出在哪里,我尝试过用不同的方式将对象转换为字符串,但它不断返回异常。 这是我的代码: 这是Product类(为简单起见排除了getter/Setters/equals()/hash()): 这是stack我得到的: 这是我使用转换器的jsf:

  • 问题内容: 我正在编写我的第一个Java EE 6 Web应用程序作为学习练习。我没有使用框架,只有JPA 2.0,EJB 3.1和JSF 2.0。 我有一个自定义转换器,可以将存储在SelectOne组件中的JPA实体转换回实体。我正在使用InitialContext.lookup获取对会话Bean的引用以查找相关实体。 我想创建一个通用的实体转换器,所以不必为每个实体创建一个转换器。我以为我会

  • 反转对象的键值对,而不会改变它。 使用 Object.keys() 和 Array.reduce() 来反转对象的键值对。 const invertKeyValues = obj => Object.keys(obj).reduce((acc, key) => { acc[obj[key]] = key; return acc; }, {}); invertKeyValu