我正在尝试将插件编写到框架应用程序(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(例如以某种方式使用反射)?关于如何解决这个问题的任何其他想法?
答案 0 :(得分:0)
这两种类名称等于的java.lang.ClassCastException
类型出现在同一个类或两个具有相同名称的类由2个不同的类加载器加载时。
我不知道Joget,但你在谈论插件。框架通常在单独的类加载器中加载插件,以确保它们之间的适当隔离。
既然你说我已经仔细检查过,看起来我在我的插件包中包含了正确的。,你可能想要从你的包中删除spring-security
,因为它可能已经被框架类加载器加载了。
您正在使用Maven
,因此您只需将<scope>provided</scope>
添加到spring-security
依赖项(但不确定,因为我们没有您的pom.xml)
答案 1 :(得分:0)
我在运行插件时遇到了同样的异常。
也就是说,没有存储库(groupId,artificateId等)要部署在插件的pom.xml中。解决方法是,转到目标文件夹并打开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>
我曾经遇到过这种类型的问题,因为存储库不正确,另请参阅Maven Repository以找到源的官方存储库。
我希望它可以帮助=)
干杯