【问题标题】:JPA IllegalArgumentException, but expected and actual type are identicalJPA IllegalArgumentException,但预期类型和实际类型相同
【发布时间】:2014-02-05 21:24:04
【问题描述】:

最近,我和一位同事开始在我们的 WebLogic 开发环境中遇到问题。突然我们不能再部署我们的项目了。

应用程序在 Eclipse 中构建,但是当我们部署到本地 WebLogic 实例时,我们会收到 IllegalArgumentException

SEVERE: Critical error during deployment: 
com.sun.faces.config.ConfigurationException: CONFIGURATION FAILED! java.util.concurrent.ExecutionException: java.lang.ExceptionInInitializerError
Caused by: javax.faces.FacesException: java.util.concurrent.ExecutionException: java.lang.ExceptionInInitializerError
Caused by: java.util.concurrent.ExecutionException: java.lang.ExceptionInInitializerError
Caused by: java.lang.ExceptionInInitializerError
Caused by: java.lang.IllegalArgumentException: You have attempted to set a value of type class ca.<orgdomain>.domain.FolderTransactionType for parameter 1 with expected type of class ca.<orgdomain>.domain.FolderTransactionType from query string select result from TransactionFee result where result.folderTransactionType = ?1 .
    at org.eclipse.persistence.internal.jpa.EJBQueryImpl.setParameterInternal(EJBQueryImpl.java:1202)

对我来说主要的混淆点是“尝试”类型和“预期”类型是相同的。

(可能是红鲱鱼)我不确定这是否相关,但两个受影响的系统都位于不同的开发分支上(我们一周前分叉了),但我们今天都开始遇到问题。与我在同一分支的另一位开发人员没有遇到此问题。

【问题讨论】:

  • 如果这两个同名的类被不同的类加载器加载,那么它们将彼此不同。

标签: java jpa eclipselink weblogic11g


【解决方案1】:

正如@kocko 所说,这很可能是类加载器问题。

对象类型的真正运行时标识取决于类以及加载它的类加载器。

如果您的运行时框架有多个(不相关的)类加载器,并且您在其中两个或更多类加载器中加载相同的类,那么最终结果是具有相同名称的不同类。即使类的两个“版本”的代码是相同的。

请注意,同一 JVM 中的不同“webapps”很可能有不同的类加载器。如果您遇到对象由一个 Web 应用创建并传递给另一个 Web 应用的情况,您可能会遇到类型不兼容的问题。


您能否指出一些有关如何跟踪此类事件的资源?

这里有一些提示:

  • 获取比较中涉及的 Class 对象,以及 确认他们是否是equal。如果不检查他们各自的 类名和类加载器是。

  • 检查所有 JAR 文件以查看违规类是否在 多个 JAR。

  • 阅读 Weblogic 文档以了解它如何管理 类加载器。然后检查您配置它们的方式。

【讨论】:

  • 您能否指出一些有关如何跟踪此类事件的资源?据我所知,这些不应该由不同的类加载器(同一个应用程序)加载。当然,“不应该”和“不是”是完全不同的东西。
猜你喜欢
  • 2023-02-12
  • 2021-05-28
  • 2015-04-15
  • 1970-01-01
  • 1970-01-01
  • 2016-07-18
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多