我有2个不同Java的项目,一个拥有2类: dynamicbeans.DynamicBean2dynamic.Validator.

在其他项目,我载这两个类动态并将它们存储在一个 Object

class Form {
    Class beanClass;
    Class validatorClass;
    Validator validator;
}

我然后继续前进并创建一个 Validator 目的使用 validatorClass.newInstance() 并将其存储在 validator 然后我创建了一个豆目以及使用 beanClass.newInstance() 和增加它的会议。

portletRequest.setAttribute("DynamicBean2", bean);

在生命周期的 Form 的项目,我呼 validator.validate() 其载荷以前创建的豆目从本届会议(我Websphere门户服务器)。当我试着投此目的回到一个 DynamicBean2 它没有一个ClassCastException。

当我拉的对象回来了本届会议使用

faces.getApplication().createValueBinding("#{DynamicBean2}").getValue(faces);

和检查之类的使用 .getClass() 我得到 dynamicbeans.DynamicBean2.这一类我要投给然而,当我试试我的ClassCastException。

任何理由为什么我得到这个吗?

有帮助吗?

解决方案

我不相当下你的描述的程序流程,但是通常当你得到ClassCastExceptions你无法解释你加载的类与一个类装入器然后试图把它同类载入由另一类装入器。这将不工作他们由两个不同的类物体内JVM和铸将失败。

还有一个 条约类加载在WebSphere.我不能说它如何适用于你的申请,但有一些可能的解决办法。我可以认为至少:

  1. 变化的背景下舱装载机。要求,你实际上可以得到一个参考到一个适当的舱装载机,这是不可能的,你的情况。

    Thread.currentThread().setContextClassLoader(...);
    
  2. 确保类装载的一类装载更高的层次。

  3. Serialize和deserialize的对象。(呸!)

有可能是更适当的方式为特定的情况。

其他提示

这类物体装入不同的类装入器,因此实例创建的,从在各类被视为'不符'.这是一个常见的问题在环境中有许多不同的类装入器被使用并对象,正在通过。这些问题可以很容易地出现在Java EE和门户网站的环境。

铸造一个类实例要求这类联系对象被铸造的是一样载入通过当前线程方面的类装载器。

我得到了A2AClassCastException问题时试图建立一个列表中的对象从XML使用Apache共用沼气池。

List<MyTemplate> templates = new ArrayList<MyTemplate>();
Digester digester = new Digester();
digester.addObjectCreate("/path/to/template", MyTemplate.class);
digester.addSetNext("/path/to/template", "add");
// Set more rules...
digester.parse(f); // f is a pre-defined File

for(MyTemplate t : templates) { // ClassCastException: Cannot cast mypackage.MyTemplate to mypackage.MyTemplate
    // Do stuff
}

如上文所述,原因是该沼气池不使用同一类装入器为剩余的程序。我跑了这Boss,而事实证明,commons-digester.jar 是不是在Boss的lib directory,而是在一个网络应用程序的lib directory.复制的罐子到mywebapp/WEB-INF/lib还解决了这个问题。另一个解决办法是casll沼气池。setClassLoader(MyTemplate.类。getClassLoader()),但是这感觉就像一个非常丑陋的解决方案在这一方面起到举足轻重的作用。

我有同样的问题,同时采用几种Boss实例在不同的机器。到不好我不是偶然发现这个职位早。
有的文物部署在不同的机器,他们两个声明的类装载有相同的名称。我改变了一个类装入器的名称和一切工作的现=>要注意的复制、粘贴!

为什么不ClassCastException扔提的参与类机?-我认为那将是非常有用的信息。
任何人都不会知道是否会有任何像这样的可用于未来?需要检查的舱装载机的20至30的文物不是愉快的。或是有什么我错过了在例外的文字?

编辑:我的编辑META-INF/jboss-app.xml 文件和更改名称的加载程序,这个想法是要有一个独特的名称。我们在工作中使用伪身份证(独特的)合并版本插入由家({$version})在建立。
使用动态领域是唯一的可选但帮助如果你要部署的不同版本相同的应用程序。

<jboss-app>
   <loader-repository> 
   com.example:archive=unique-archive-name-{$version}
   </loader-repository> 
</jboss-app>

你可以找到一些信息: https://community.jboss.org/wiki/ClassLoadingConfiguration

我有同样的问题,并且我终于找到一个解决方法java.net :

复制所有 org.eclipse.persistence jar 文件从 glassfish4/glassfish/modulesWEB-INF/lib.然后去你的 glassfish-web.xml, ,并设置 class-delegatefalse.

为我工作!

我有一个类似的问题与修订和Boss为7.1.问题和解决方案描述了这里: 内xml。绑定。JAXBException:Class***,也没有任何其超类已知这个上下文.例外的是,给予被org.foo。酒吧。ValueSet不能投org.foo。酒吧。ValueSet

我有同样的问题上一个验证EJB,EJB是返回的一个列表的目的和具有一个远程和当地的接口。我用当地的口的错误是什么工作刚刚收到一点你试图转换对象名单。

当地/远程接口:

public interface DocumentStoreService {

    @javax.ejb.Remote
    interface Remote extends DocumentStoreService {
    }

    @javax.ejb.Local
    interface Local extends DocumentStoreService {
    }

EJB豆:

@Stateless
public class DocumentStoreServiceImpl implements DocumentStoreService.Local, DocumentStoreService.Remote {

正确的春季的包装EJB:

<bean id="documentStoreService" class="org.springframework.ejb.access.LocalStatelessSessionProxyFactoryBean">
    <property name="jndiName" value="java:global/dpc/dpc-ejb/DocumentStoreServiceImpl!santam.apps.dpc.service.DocumentStoreService$Remote"/>
    <property name="businessInterface" value="santam.apps.dpc.service.DocumentStoreService$Remote"/>
    <property name="resourceRef" value="true" />
</bean>

注意到美元的远程,你可以改变这个美元地方,它会找到当地的接口只是罚款,并且也执行的方法没有任何问题(从一个单独的程序在同一容器),但该模型对象不是封送,并从一个不同的类装载如果使用当地的口的错误。

另一种选择:

发生在我身上任何的,但我猜,它可以发生在其他的服务器,以及-如果你这样做(仅)"发布",并为此你的一些课程重新加载。而不是做"洁净的",因此所有的课程将重新装在一起。

我有同样的问题EJB查从另一个EJB。我解决了加@远程(MyInterface.class)以EJB类配置

有相同的 my.package.MyClass cannot be cast to my.package.MyClass 在验证10.1和,正如我理解的,我没有相反的是什么@埃米尔*伦德伯格中所述他的回答。

我加入了 模块 (其中包含 my.package.MyClass)来 my.war/WEB-INF/jboss-deployment-structure.xml 作为一个依赖

<dependencies>
    ...
    <module name="my.package"/>
</dependencies>

和删除相应的 罐子my.war/WEB-INF/lib, 重新部署的战争和随后的编码工作的预期。

因此,我们确信它解决了这一问题。现在,我们需要确保该问题不会再回来的,例如,当该更新版本的 战争 将组装和部署。

为此,在来源的那些 战争, 它需要加入 <scope>provided</scope> 对于那些 罐子pom.xml, ,因此得当 my.war 重新组装的下一时间的修复/加强代码注,它不会束这个 罐子my.war/WEB-INF/lib.

我得到这个问题之后添加依赖来 spring-boot-devtools 在我Springboot项目。我删除的依赖,问题就走了。我最好的猜在这一点是, spring-boot-devtools 带来的一种新类装入器而引起的问题的类铸造间的问题不同类装入器在某些情况下,新的类装入器是不使用一些线。

参考: 一个推土地例外有关的春季启动代码

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top