0

我正在尝试将插件写入框架应用程序(Joget)。我的插件源看起来像这样:

public class MyPlugin extends ExtDefaultPlugin implements ApplicationPlugin, ParticipantPlugin { 
...
    public void execute(){
    ...
    SecurityContextImpl secContext = (SecurityContextImpl) WorkflowUtil.getHttpServletRequest().getSession().getAttribute("SPRING_SECURITY_CONTEXT");

    }
}

当我运行插件时,我得到以下异常。

java.lang.ClassCastException: org.springframework.security.context.SecurityContextImpl cannot be cast to org.springframework.security.context.SecurityContextImpl

我正在使用 Maven。现在,由于两者具有相同的包名称,我假设我在插件 JAR(包含 SecurityContextImpl 类)中不小心使用了错误的包版本,而不是框架中的包版本。但是我已经仔细检查过,看起来我在我的插件包中包含了正确的一个。

有没有办法查看我的类的类加载器或源 JAR(例如以某种方式使用反射)?关于如何解决这个问题的任何其他想法?

4

2 回答 2

0

我在运行插件时遇到了同样的异常。

一般有两种情况:

1.班级为本地班级。

也就是说,插件的 pom.xml 中没有要部署的存储库(groupId、artificateId 等)。解决方法是,去目标文件夹打开xxx-0.0.1-snapshot.jar文件,然后打开META-INF/MANIFEST.MF,添加那个类的源文件/dependency/file.jar,然后添加源jar 到依赖文件夹

备注:最好给出本地文件的版本,并按照 pom.xml 中所示添加它,以便在代码中作为 src 找到它。

<!-- your source jar need to be renamed as example-1.0.0.jar -->
<dependency>
    <groupId>this.should.be.the.prefix.of.your.package</groupID>
    <artificateId>file.name<artificateId>
    <version>1.0.0</version>
    <systemPath>${basedir}/lib/stclient_updated-1.0.0.jar</systemPath>
    <scope>system</scope>
</dependency> 

2. 该类是一个带有repository的远程类

我曾经遇到过这种类型的问题,因为存储库不正确,另请参阅Maven 存储库以找到源的官方存储库。

我希望它可以帮助=)

干杯

于 2014-05-26T12:42:46.830 回答
0

java.lang.ClassCastException当同一个类或两个同名的类被 2 个不同的类加载器加载时,就会出现这种类型的,其中两个类名称相同。

我不知道 Joget,但你在谈论插件。框架通常在单独的类加载器中加载插件,以确保它们之间的适当隔离。

既然你说我已经仔细检查过,看起来我在我的插件包中包含了正确的一个。,你可能想spring-security从你的包中删除,因为它可能已经被框架类加载器加载了。

您正在使用Maven,因此您可以简单地添加<scope>provided</scope>spring-security依赖项(但不确定,因为我们没有您的 pom.xml)

于 2013-06-13T19:54:49.680 回答