我想避免使用锅炉板代码来创建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;
}
}
类似的问题已经有很多答案了,但我想要一个普通的解决方案(没有*脸)。以下几点仍然让我无法确定我的代码片段的质量:
这种方法是杂乱无章的,内存效率低下。
在小型应用程序中“可以”,但在具有数万或数十万个潜在实体的大型应用程序中绝对不行,这些实体可以在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
我在命名空间