Как избежать символа & в Spring Spel Evaluator

У меня есть выражение, содержащее один &, и Spring Spel Evaluator продолжает выдавать ошибку missing expected character '&'

Я пытался использовать обратную косую черту и двойную обратную косую черту, чтобы избежать этого, но затем это дает недопустимую ошибку escape-символа.

Это мое выражение, которое мне нужно разобрать

(#PaymentType!=null&&!(#PaymentType).toString().isEmpty()?'PaymentType:'+((#PaymentType)+' ')+'$':'')+(#ProductSearchState!=null&&!(#ProductSearchState).toString().isEmpty()?'ProductSearchState:'+((#ProductSearchState)+' ')+'$':'')+(#Manufacturer_s39s_s32Name_s32_s38_s32Address!=null&&!(#Manufacturer_s39s_s32Name_s32_s38_s32Address).toString().isEmpty()?'Manufacturer's Name & Address:'+((#Manufacturer_s39s_s32Name_s32_s38_s32Address)+' '):'')

Ниже приведен код, который я использую для разбора выражения.

 public static void main (String args[]) {
   String expression="(#PaymentType!=null&&!(#PaymentType).toString().isEmpty()?'PaymentType:'+((#PaymentType)+' ')+'$':'')+(#ProductSearchState!=null&&!(#ProductSearchState).toString().isEmpty()?'ProductSearchState:'+((#ProductSearchState)+' ')+'$':'')+(#Manufacturer_s39s_s32Name_s32_s38_s32Address!=null&&!(#Manufacturer_s39s_s32Name_s32_s38_s32Address).toString().isEmpty()?'Manufacturer's Name & Address:'+((#Manufacturer_s39s_s32Name_s32_s38_s32Address)+' '):'')";
   String g = expression;
   System.out.println(g);
        final Set<String> dependent = new HashSet<>();
        try {
            ExpressionParser parser = new SpelExpressionParser();

//        log.info("Extracting dependent attributes for {} ", expression);

            new SplExpressionVisitor<Void>() {
                public void visit(SpelExpression expression) {
                    visitNode(expression.getAST());
                }

                @Override
                protected Void visit(VariableReference node) {
                    final String variableReferenceName = getVariableReferenceName(node);
                    dependent.add(variableReferenceName);
                    return super.visit(node);
                }

            }.visit((SpelExpression) parser.parseExpression(expression));

        }catch (Exception e){
            System.out.println(e.toString());
        }
    }

person Aman Kumar Sinha    schedule 20.03.2018    source источник
comment
Вы пробовали двойную косую черту \\ перед &?   -  person RubioRic    schedule 20.03.2018
comment
@RubioRic да, есть. Тогда это дало исключение недопустимого escape-символа.   -  person Aman Kumar Sinha    schedule 20.03.2018
comment
если я поставлю ////& перед &, тогда это сработает, но тогда мне придется удалить одинарную кавычку в изготовителе. использовал / и // перед одинарной кавычкой, чтобы избежать ее. Все равно выдает ошибку   -  person Aman Kumar Sinha    schedule 20.03.2018
comment
Возможно, проблема в этой одинарной кавычке, а не в &. Вы пытались избежать этой цитаты? stackoverflow.com/a/6206675/2553194   -  person RubioRic    schedule 20.03.2018


Ответы (1)


Ваша строка 'Manufacturer's Name & Address:' выглядит как строка 'Manufacturer', за которой следует какая-то ерунда, поскольку вы не можете использовать одинарные кавычки как для разделения строки, так и внутри строки.

Вам нужно использовать два символа одинарной кавычки внутри строки, чтобы избежать ее, например:

'Manufacturer''s Name & Address:'

См. "литеральные выражения.» справочной документации по языку SpEL для получения дополнительной информации о включении литералов в ваши выражения.

person Community    schedule 20.03.2018