我有一个@SessionScoped bean,我想将其用作地图,以便我可以在视图中使用EL动态获取其属性。
myBean['someDynamicProperty']
我通过实现java.util.Map,用我的应用程序逻辑实现get(Object o)并在所有其他覆盖Map方法中抛出UnsupportedOperationException来实现这一点。
@SessionScoped
@Named
public class MyBean implements Map<String, String> {
@Override
public String get(Object key) {
// Application logic here
}
@Override
public boolean containsKey(Object key) {
throw new UnsupportedOperationException();
}
// All other map methods overriden like containsKey
}
这些属性是只读的,我只需要使用我的代码中的get方法,但是不安装其他Map方法是否安全?
有没有更好的方法来定义bean中EL的动态属性?
答案 0 :(得分:2)
最好将地图存储为会话属性,因此您不需要创建@SessionScoped
bean,并且可以通过表达式语言访问它而不会出现问题。
public void methodThatShouldCreateTheMap() {
//declaring the variable as myBean for compatibility with your current code
Map<String, Object> myBean = new HashMap<String, Object>();
//fill myBean here...
//...
//store myBean in session
FacesContext.getCurrentInstance()
.getExternalContext()
.getSession(false)
.setAttribute("myBean", myBean);
}
您可以直接在EL中访问地图:
${myBean['key']}
来自评论:
问题是我的bean真的不是
Map
。在get方法中,我根据收到的密钥实现了我需要的逻辑。 (...)就我而言,吸气剂中的商业逻辑并不昂贵。
似乎在某种程度上你需要你的bean来实现Map
接口。而是重新发明轮子或标记要抛出UnsupportedOperationException
的方法,从已经实现所有方法的类(如HashMap
或LinkedHashMap
)或实现Map
的类扩展但是根本没有实现它,比如AbstractMap
,并且空了其他方法:
@Named
@SessionScoped
public class MyBean extends AbstractMap<String, Object> {
@Override
public Object get(String key) {
//add your logic here...
}
@Override
public void set(String key, Object value) {
//do nothing...
}
//similar for other unnecessary methods...
}