Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/jsf/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
通过实现java.util.Map#get为EL提供动态bean属性_Java_Jsf_El - Fatal编程技术网

通过实现java.util.Map#get为EL提供动态bean属性

通过实现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

我有一个@sessionCoped 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
}
@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...
}