gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 04:59:21 25 4
gpt4 key购买 nike

在 Spel 中,为 List 属性分配一些值很容易。例如,将对象 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);

但是,如果您想为给定列表分配值,您该怎么做定义为方法中的变量。例如:

List<String> fooList = new ArrayList<String>();
context = new StandardEvaluationContext(fooList);
parser.parseExpression("SOMETHING[0]='come on'")
.getValue(context);

在上面的例子中,我不知道该用什么来代替某些东西来完成这项工作。如果我输入“fooList[0]='....'”,它会抛出一个异常,提示 fooList 中没有 fooList 属性。

如果我输入“[0]='....'”,它会抛出“无法增长集合:无法确定列表元素类型”。

然后我定义了一个像这样的通用包装器:

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;
}
}

然后尝试测试这个:

List<String> fooList = new ArrayList<String>();
SpelWrapper<List<String>> no = new SpelWrapper<List<String>>(fooList);
context = new StandardEvaluationContext(no);

parser.parseExpression("obj[0]='olaaa'")
.getValue(context);

但它不起作用,仍然收到这个丑陋的消息:

Unable to grow collection: unable to determine list element type

我尝试了其他表达式语言,如 MVEL、OGNL、JEXL,但我注意到它们不支持自动空引用初始化,这对我来说很重要。然而他们似乎也没有解决上述问题。

我也开始思考,如果我需要的不是表达式语言的情况怎么办!问题是我的需要不仅仅是定义一个变量并尝试使用 EL 分配值。

就我而言,我有一些简单的 POJO 域类 bean 和一些输入字符串,例如

 "bar[0].foo.value=3434"

现在我应该能够创建 Bar 列表并将 Bar 实例作为其第一个元素,然后使用 Foo 实例设置 foo 属性,最后将 Foo 的值设置为 3434。

关于这个问题有什么想法吗?

提前致谢

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

最佳答案

问题是由于 Java 中的类型删除、Spring 或其他 Els 没有线索自动在链中为包括列表在内的通用根对象启动空值。例如,在 SpEl 中这样的表达式:

#root[10].mySet='ohoy'

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

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

无论如何,为了做这些事情,类型删除真的很痛苦,看来他们(也应用其他 EL)仍然可以做一些努力来围绕这个问题做一些工作。例如

1) 如果列表不为空,则可以在运行时从中获取真实元素的类型。
2) 更改 getValue 以获取泛型类型传递参数并将其用于启动。
3) 如果是数组,则返回展开后的数组。
4)...

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

PropertyAccessor

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

关于java - 如何使用 Spring 表达式语言(或您知道的其他表达式语言)为定义为变量的一些对象列表赋值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28447222/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com