首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >用于解析器编译的ANTLR Runtime版本4.7.2与当前运行时版本4.5.1不匹配

用于解析器编译的ANTLR Runtime版本4.7.2与当前运行时版本4.5.1不匹配
EN

Stack Overflow用户
提问于 2020-06-04 00:04:29
回答 2查看 807关注 0票数 0

我使用的是Mule EE 3.9.0、Java 8和MSSQL 8.2.2.jre。

我们的应用程序是在mule流上开发的集成框架,它为某些流创建了db:insert (内部使用mule EE 3.9.0 DB模块)。

最近,我不得不调用mule flow中的JAVA组件来进行数据库调用,为此我使用了MSSQL-JDBC 8.2.2.jre8版本。之后,我在运行那些旧的db:insert mule流时出现了下面的错误:

代码语言:javascript
复制
ANTLR Tool version 4.7.2 used for code generation does not match the current runtime version 4.5.1ANTLR Runtime version 4.7.2 used for parser compilation does not match the current runtime version 4.5.1ERROR 2020-06-03 11:09:17,946 [DispatchThread: [com.ibm.mq.jmqi.remote.impl.RemoteSession[:/4867ad1f][connectionId=414D5143514D53544D4C303120202020F4F7865E01F7FB26]]] org.mule.exception.CatchMessagingExceptionStrategy:
********************************************************************************
Message               : null (java.lang.ExceptionInInitializerError).
Payload Type          : [B
Element               : ........
Element XML           : <db:insert config-ref="Generic_Database_Configuration" doc:name="Database" transactionalAction="NOT_SUPPORTED"> ...
Root Exception stack trace:
java.io.InvalidClassException: org.antlr.v4.runtime.atn.ATN; Could not deserialize ATN with UUID 59627784-3be5-417a-b9eb-8131a7286089 (expected aadb8d7e-aeef-4415-ad2b-8204d6cf042e or a legacy UUID).
at org.antlr.v4.runtime.atn.ATNDeserializer.deserialize(ATNDeserializer.java:153)
at com.microsoft.sqlserver.jdbc.SQLServerLexer.<clinit>(SQLServerLexer.java:424)
at com.microsoft.sqlserver.jdbc.SQLServerFMTQuery.<init>(SQLServerFMTQuery.java:100)
at com.microsoft.sqlserver.jdbc.SQLServerParameterMetaData.<init>(SQLServerParameterMetaData.java:347)
at com.microsoft.sqlserver.jdbc.SQLServerPreparedStatement.getParameterMetaData(SQLServerPreparedStatement.java:3100)
at com.microsoft.sqlserver.jdbc.SQLServerPreparedStatement.getParameterMetaData(SQLServerPreparedStatement.java:3111)
at org.apache.commons.dbcp2.DelegatingPreparedStatement.getParameterMetaData(DelegatingPreparedStatement.java:266)
at org.apache.commons.dbcp2.DelegatingPreparedStatement.getParameterMetaData(DelegatingPreparedStatement.java:266)
at org.mule.module.db.internal.resolver.param.QueryParamTypeResolver.getParameterTypes(QueryParamTypeResolver.java:52)
at org.mule.module.db.internal.resolver.param.DefaultParamTypeResolver.getParamTypesUsingMetadata(DefaultParamTypeResolver.java:74)
at org.mule.module.db.internal.resolver.param.DefaultParamTypeResolver.getParameterTypes(DefaultParamTypeResolver.java:49)
at org.mule.module.db.internal.domain.connection.AbstractDbConnection.getParamTypes(AbstractDbConnection.java:53)
at org.mule.module.db.internal.resolver.query.ParametrizedQueryResolver.getParameterTypes(ParametrizedQueryResolver.java:68)
at org.mule.module.db.internal.resolver.query.ParametrizedQueryResolver.resolve(ParametrizedQueryResolver.java:56)
at org.mule.module.db.internal.processor.AbstractSingleQueryDbMessageProcessor.executeQuery(AbstractSingleQueryDbMessageProcessor.java:48)
at org.mule.module.db.internal.processor.AbstractDbMessageProcessor.process(AbstractDbMessageProcessor.java:81)
at org.mule.execution.ExceptionToMessagingExceptionExecutionInterceptor.execute(ExceptionToMessagingExceptionExecutionInterceptor.java:27)
at org.mule.execution.MessageProcessorNotificationExecutionInterceptor.execute(MessageProcessorNotificationExecutionInterceptor.java:111)
at org.mule.execution.MessageProcessorExecutionTemplate.execute(MessageProcessorExecutionTemplate.java:44)
at org.mule.processor.BlockingProcessorExecutor.executeNext(BlockingProcessorExecutor.java:88)
at org.mule.processor.BlockingProcessorExecutor.execute(BlockingProcessorExecutor.java:59)

为什么mssql-jdbc与mule 3.9.0冲突,antlr不能再解析mule中的SQL?

我曾尝试将antlr- but和antlr-tool添加到POM依赖项中,但没有成功。如果我用7.0.0.jre替换mssql-jdbc版本8.2.2.jre,它开始工作正常(这是件好事),但我需要mssql-jdbc 8.2.2.jre的一些特性。

EN

回答 2

Stack Overflow用户

发布于 2020-06-04 01:11:48

似乎在使用的ANTLR版本中存在冲突,但它看起来不像是来自Mule。Mule 3.9.0使用ANTLR 3.5.x。该错误提到冲突发生在ANTLR 4.7.2和4.5.1之间。

也许一些连接器、驱动程序或jar库正在添加这些冲突的版本。JDBC SQL驱动程序正在使用其中一个版本。这是可以确认的,但看看堆栈跟踪中的最后一行:

代码语言:javascript
复制
java.io.InvalidClassException: org.antlr.v4.runtime.atn.ATN; Could not deserialize ATN with UUID 59627784-3be5-417a-b9eb-8131a7286089 (expected aadb8d7e-aeef-4415-ad2b-8204d6cf042e or a legacy UUID).
at org.antlr.v4.runtime.atn.ATNDeserializer.deserialize(ATNDeserializer.java:153)
at com.microsoft.sqlserver.jdbc.SQLServerLexer.<clinit>(SQLServerLexer.java:424)

微软的SQLServerLexer类正在调用ANTLR4类ATNDeserializer。

也许Maven dependency tree可以帮助理解另一个版本的来源。

此外,使用Java verbose classloading (-verbose:class)可以显示类是从何处加载的。它可以作为附加选项添加到wrapper.conf中。

顺便说一句,如果你正在使用Mule EE 3.9.0,你真的应该考虑升级到有大量修复的Mule EE 3.9.4。

票数 0
EN

Stack Overflow用户

发布于 2020-06-04 23:20:52

mssql-jdbc.8.2.1.jre仅解析参数化的SQL查询,并使其预编译。在解析时,使用ANTLR运行时进行验证。在我的例子中,验证失败是因为我们使用了mule db:insert,如下所示:

代码语言:javascript
复制
<db:insert config-ref="Generic_Database_Configuration" doc:name="Database" transactionalAction="NOT_SUPPORTED">
<db:parameterized-query><![CDATA[insert into EIS.T_TABLE (ID, EXPIRY_TIMESTAMP, INSERT_TIMESTAMP, CC_DATA, CORRELATION_ID) values(#[db_data.ID], #[db_data.EXPIRY_TIMESTAMP.toString()], #[db_data.INSERT_TIMESTAMP.toString()], #[db_data.CC_DATA], #[db_data.MQ_CORRELATION_ID])]]></db:parameterized-query>

ANTLR运行时不喜欢参数化SQL中的'#‘、']’和'[‘。因此,我们替换了mule db:insert,如下所示,它工作得很好。

代码语言:javascript
复制
<db:insert config-ref="Generic_Database_Configuration" doc:name="Database" transactionalAction="NOT_SUPPORTED">
<db:parameterized-query><![CDATA[insert into EIS.T_TABLE (ID, EXPIRY_TIMESTAMP, INSERT_TIMESTAMP, CC_DATA, CORRELATION_ID) values(:ID, :EXP_TIME, :INSERT_TIME, :CC_DATA, :CORRELATION)]]></db:parameterized-query>
    <db:in-param name="ID" type="NCHAR" value="#[db_data.ID]"/>
    <db:in-param name="EXP_TIME" type="TIMESTAMP" value="#[db_data.EXPIRY_TIMESTAMP.toString()]"/>
    <db:in-param name="INSERT_TIME" type="TIMESTAMP" value="#[db_data.INSERT_TIMESTAMP.toString()]"/>
    <db:in-param name="CC_DATA" type="VARBINARY" value="#[db_data.CC_DATA]"/>
    <db:in-param name="CORRELATION" type="NVARCHAR" value="#[db_data.CORRELATION_ID]"/>

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/62177392

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档