【问题标题】:ODI: KM Java BeanShell - escape double quotesODI:KM Java BeanShell - 转义双引号
【发布时间】:2017-06-29 06:28:28
【问题描述】:

我想在知识模块的任务中设置一个变量,目标技术设置为 Java BeanShell。该值表示映射表达式,其中源表位于 MSSQL 数据库中。列名用双引号括起来,这会导致模板出现问题。

列表达式为:

source_tab."Entry Number"

任务(Java BeanShell)

<$
   String SEL_COLS = "<%=odiRef.getColList(0, "", "[EXPRESSION]\t[ALIAS_SEP] [CX_COL_NAME]", ",\n\t", "", "")%>";
$>

此变量分配失败,因为 " in source_tab."Entry Number" 未转义 - 代码无法编译。

odiRef.getQuotedString 没有解决问题...

【问题讨论】:

    标签: oracle oracle-data-integrator


    【解决方案1】:

    如果生成的代码在 JBS 技术中作为最终代码执行,odiRef.getQuotedString 会有所帮助。当我们以下列方式使用它时(在 ?-、$- 或 @-substitution 中):

    <$
    String SEL_COLS = <%=odiRef.getQuotedString(odiRef.getColList(0, "", "[EXPRESSION]\t[ALIAS_SEP] [CX_COL_NAME]", ",\n\t", "", ""))%>;
    $>
    

    然后结果像这样失败:

    ... Caused by: org.apache.bsf.BSFException: BeanShell script error: 
    Parse error at line 3, column 37.  Encountered: Entry BSF info: ....
    ... 11 more
    
    Text: <$
       String SEL_COLS = "SOURCE_TAB.\"Entry Number\"      ENTRY_NUMBER";
    $>.
    

    这看起来不错,但不起作用。它可以作为 JBS Technology 中的最终代码(我的意思是所有替换的结果)。不幸的是,任何替换都会吃反斜杠。

    好的,如果标准的 odiRef-function 不起作用,让我们自己编写:

    <%
    String getQuotedStringCustomized(String s){
       return '"'+s.replaceAll('"'.toString(),'"'+"+'"+'"'+"'+"+'"')+'"';
    }
    %>
    -- other code........
    <$
    String SEL_COLS = <%=getQuotedStringCustomized(odiRef.getColList(0, "", "[EXPRESSION]\t[ALIAS_SEP] [CX_COL_NAME]", ",\n\t", "", ""))%>;
    $>
    

    在 JBS 替换中将 " 放入 Java 文字的唯一方法是使用 Char 文字 '"' 或在无法使用 Char 类型时使用 '"'.toString() 表达式。

    最后:

    在最终的 JBS 代码中,您可以使用 \",但只能在替换中使用 +'"'+

    【讨论】:

    • 将双引号连接为一个字符为我指明了正确的方向。我的情况发生了一些变化,实际上我不得不像 '\"' 一样在 char 本身中转义双引号。我真的不喜欢 ODI 处理这个问题的方式——有时模板通常感觉就像是在打自己的腿。
    • 单引号是字符字面量。所以,里面只能出现一个符号。例如。 'X' 是正确的,但 'AB' 是错误的。如果您使用'\"',则它等效于'"'(不带反斜杠)。就像上面解释的那样,ODI 在 JBS 替换中“吃掉”了反斜杠。它是由于源代码处理而发生的。 ODI 总是将所有内容转换为 JBS 代码,它会再次打印您的代码,然后才是真正的执行。
    • 因此,如何告诉 beanshell 实际执行必须在字符串中包含双引号的代码?
    猜你喜欢
    • 2020-11-26
    • 1970-01-01
    • 2013-06-17
    • 2013-08-09
    • 2011-09-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多