【问题标题】:How to escape a & character in spring Spel Evaluator如何在春季 Spel Evaluator 中转义 & 字符
【发布时间】:2018-08-29 02:46:27
【问题描述】:

我有一个包含单个 & 的表达式,并且 spring 拼写评估器不断抛出错误 missing expected character '&'

我尝试使用反斜杠和双反斜杠对其进行转义,但随后出现非法转义字符错误。

这是我需要解析的表达式

(#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());
        }
    }

【问题讨论】:

  • 你在 & 之前尝试过双斜杠 \\ 吗?
  • @RubioRic 是的,我有。然后它给出了非法转义字符异常。
  • 如果我将 ////& 放在 & 之前,那么它可以工作,但是我必须删除“制造商”中的单引号。在单引号之前使用 / 和 // 来转义它。它仍然抛出错误
  • 也许问题在于单引号而不是 &。你试过逃避那句话吗? stackoverflow.com/a/6206675/2553194

标签: java spring spring-el spelevaluationexception


【解决方案1】:

您的字符串'Manufacturer's Name &amp; Address:' 看起来像字符串'Manufacturer' 后跟一些废话,因为您不能同时使用单引号来分隔字符串以及在字符串内部。

你需要在字符串中使用两个单引号字符来转义它,像这样:

'Manufacturer''s Name & Address:'

有关在表达式中包含文字的更多信息,请参阅 SpEL 语言参考文档的“Literal Expressions”部分。

【讨论】:

    猜你喜欢
    • 2017-10-24
    • 1970-01-01
    • 1970-01-01
    • 2018-06-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多