Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/401.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 如何为使用Spring表达式语言(或您知道的其他表达式语言)定义为变量的某些对象的列表赋值_Java_Spring_Expression_El_Spring El - Fatal编程技术网

Java 如何为使用Spring表达式语言(或您知道的其他表达式语言)定义为变量的某些对象的列表赋值

Java 如何为使用Spring表达式语言(或您知道的其他表达式语言)定义为变量的某些对象的列表赋值,java,spring,expression,el,spring-el,Java,Spring,Expression,El,Spring El,在Spel中,很容易为列表属性指定一些值。 例如,如果对象foo的属性定义为List,我通常会: SpelParserConfiguration config = new SpelParserConfiguration(true,true); ExpressionParser parser = new SpelExpressionParser(config); Foo foo = new Foo(); EvaluationContext context = new StandardEvaluat

在Spel中,很容易为列表属性指定一些值。 例如,如果对象foo的属性定义为List,我通常会:

SpelParserConfiguration config = new SpelParserConfiguration(true,true);
ExpressionParser parser = new SpelExpressionParser(config);
Foo foo = new Foo();
EvaluationContext context = new StandardEvaluationContext(foo);
parser.parseExpression("barList[1].test='11111111'")
    .getValue(context);
但是,对于要为给定列表赋值的情况,您该怎么办 定义为方法中的变量。e、 g:

List<String> fooList = new ArrayList<String>();
context = new StandardEvaluationContext(fooList);       
parser.parseExpression("SOMETHING[0]='come on'")
.getValue(context);
我尝试了其他表达式语言,如MVEL、OGNL、JEXL,但我注意到它们不支持自动空引用初始化,这对我来说很重要。然而,他们似乎也没有解决上述问题的办法

我也开始想,如果我需要的不是表达式语言,那该怎么办! 我需要的不仅仅是定义一个变量,并尝试使用EL分配值

在我的例子中,我有一些简单的POJO域类bean和一些输入字符串,如

 "bar[0].foo.value=3434"
现在我应该能够创建Bar列表,并将Bar实例作为其第一个元素,然后使用foo实例设置foo属性,最后将foo的值设置为3434

对这个问题有什么想法吗

提前谢谢

Eit
我错在“然而他们似乎也没有解决上述问题的办法”。例如,在MVEL中,这是一项非常容易完成的任务。但不幸的是,SPLE能够自动扩展列表并在空链中自动分配启动器,这使得它非常适合我的情况

您必须在表达式中定义一个变量,并用要处理的列表填充它,例如

context.setVariable("mylist", fooList);
然后您可以像这样访问它:

public static class SpelWrapper<T>
{
    T obj;

    public SpelWrapper(T obj)
    {
        this.obj = obj;
    }

    public T getObj() {
        return obj;
    }

    public void setObj(T obj) {
        this.obj = obj;
    }
}
parser.parseExpression("#mylist.set(0)='come on'").getValue(context);
变量中的列表由反射使用;您可以调用方法等。
我希望这会有所帮助。

问题是由于Java中的类型擦除,Spring或其他Els不知道如何在包含列表的通用根对象链中自动启动空值。 例如,在SpEl中的表达式中:

#root[10].mySet='ohoy'
如果它检测到需要首先启动ArrayList,则无法知道在给定索引下启动的正确元素类型。 这就是为什么它需要一个包装器来使用getter返回类型的反射

另一项工作是使用数组。因为数组组件类型不能保留在运行时。但问题是数组不能在运行时调整大小。 因此,它们需要以足够大的大小启动,以防止索引超出范围

无论如何,类型擦除也是一个真正的麻烦,为了做这类事情,似乎他们(也应用其他ELs)仍然可以做一些努力,围绕这一点做一些工作。例如

1) 如果列表不是空的,则可以在运行时从中获取实际元素的类型。
2) 更改getValue以获取传递的泛型类型参数并将其用于初始化。
3) 对于数组,返回扩展的数组。
4)

虽然实现一个好的EL来处理所有类型的启动或扩展似乎是一项非常困难的工作,但我正在努力扩展Ognl来实现这一点。我从

PropertyAccessor
并且得到了一些非常有希望的结果。然而,我不知道apache在开发库时有什么问题。例如,我不喜欢他们在静态类中放置处理程序的方式。我认为处理程序是一个上下文问题,但我不知道是否值得花费一些时间来扩展Ognl,但一旦我完成了工作,我就会分享结果

根据以下要求,应能工作:

parser.parseExpression("obj").getValue(context, "olaaa"); // or is it "'olaaa'"?
甚至是类似的

parser.parseExpression("obj").getValue(context, "'olaaa', 'alooo'");

谢谢@Uwe Aliner的回答。但是这个解决方案有几个问题。1) 具有上下文=新标准EvaluationContext();然后是context.setVariable(“傻瓜主义者”,傻瓜主义者);最后parser=newspelexpressionparser(config);parser.parseExpression(“#doulist.set(0)='ooooo')).getValue(上下文);引发此异常:“class org.springframework.expression.spel.ast.MethodReference”不支持setValue(ExpressionState,Object)。2)我无法定义变量,设置上下文后,只需执行以下操作:“#root[0]='ooooo'”。问题是它无法将索引转换为空值。然后使上下文能够自动扩展列表(使用th SpelParserConfiguration)再次导致无法增长集合失败:无法确定列表元素类型如果我自己在第一个解决方案中扩展列表,问题就解决了。但由于这些表达式,(我无法在其源代码中操纵表达式,它们就是它们。我只能在得到它们后才能更改它们。例如,通过regex)我想看看是否有一种方法可以用简单的EL解决方案来解决这一问题,并且不会让我的手变得油腻;)
parser.parseExpression("obj").getValue(context, "olaaa"); // or is it "'olaaa'"?
parser.parseExpression("obj").getValue(context, "'olaaa', 'alooo'");