В 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);
В приведенном выше примере я не знаю, что поставить вместо SOMETHING, чтобы все заработало. Если я поставлю "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.
В моем случае у меня есть несколько простых bean-компонентов класса домена POJO и некоторые входные строки, такие как
"bar[0].foo.value=3434"
Теперь я должен иметь возможность создать List of Bar и поместить экземпляр Bar в качестве его первого элемента, затем установить свойство foo с экземпляром Foo и, наконец, установить значение Foo как 3434.
Любая идея по этой проблеме?
заранее спасибо
Да Я был неправ в "Однако у них, похоже, тоже не было решения вышеуказанной проблемы". Например, в МВЭЛ это очень легко сделать. Но, к сожалению, способность SPLE автоматически расширять списки и автоматически назначать инициаторов в нулевых цепочках делает его невероятно подходящим для моего случая.