通过实现java.util.Map#get为EL提供动态bean属性
我有一个@sessionCoped bean,我想用作映射,以便在视图中使用EL动态获取它的属性通过实现java.util.Map#get为EL提供动态bean属性,java,jsf,el,Java,Jsf,El,我有一个@sessionCoped bean,我想用作映射,以便在视图中使用EL动态获取它的属性 myBean['someDynamicProperty'] 我通过实现java.util.Map、使用应用程序逻辑实现get(Object o)以及在所有其他重写的Map方法中抛出UnsupportedOperationException来实现这一点 @SessionScoped @Named public class MyBean implements Map<String, String
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
}
@SessionScoped
@命名
公共类MyBean实现映射{
@凌驾
公共字符串获取(对象键){
//这里的应用程序逻辑
}
@凌驾
公共布尔containsKey(对象键){
抛出新的UnsupportedOperationException();
}
//所有其他映射方法都被覆盖,如containsKey
}
属性是只读的,我只需要使用代码中的get方法,但是不实现其他Map方法安全吗
有没有更好的方法来定义bean中EL的动态属性?最好将映射存储为会话属性,这样您就不需要创建
@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);
}
从评论中: 问题是我的bean并不是一个真正的
Map
。在get方法中,我根据收到的密钥实现了所需的逻辑。(…)在我的例子中,getter中的业务逻辑并不昂贵
似乎在某种程度上,您需要bean来实现Map
接口。与其重新发明轮子或标记抛出UnsupportedOperationException
的方法,不如从一个已经实现了所有方法的类(如HashMap
或LinkedHashMap
)扩展,或者从一个实现了Map
但根本没有实现它的类(如其他方法)扩展,并将其留空:
@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...
}
@Named
@会议范围
公共类MyBean扩展了AbstractMap{
@凌驾
公共对象获取(字符串键){
//在这里添加您的逻辑。。。
}
@凌驾
公共无效集(字符串键、对象值){
//什么也不做。。。
}
//其他不必要的方法也是如此。。。
}
我通过用@Named注释我的bean来实现这一点。然而,这并不能回答问题。问题是我的bean并不是真正的地图。在get方法中,我根据接收到的键实现了所需的逻辑。@maxmil我可以推断您的bean是从Map
或类似的东西扩展而来的。我之所以提出这个解决方案,是因为我假设您的getter没有任何业务逻辑。请注意。对getter方法的多次调用是一个很好的考虑,尽管在我的例子中getter中的业务逻辑并不昂贵。您肯定希望您的代码说扩展AbstractMap
?如果我扩展AbstractMap,我至少需要实现entrySet()。我真的不希望这样做,因为计算bean的所有属性可能会很昂贵。我只是想从一个根本不是Map的bean中得到Map在EL中给我的语法糖。我开始认为我使用地图界面不是一个好主意。
@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...
}