1

奇妙な理由で、次の例外が発生します。

2011-02-08 09:53:30,667 ERROR [STDERR] (QuartzScheduler_Worker-9) java.lang.ClassCastException: org.javassist.tmp.java.lang.Object_$$_javassist_seam_7 cannot be cast to no.kommuneforlaget.fagsystem.saksapp.service.report.SystemlogListener
2011-02-08 09:53:30,668 ERROR [STDERR] (QuartzScheduler_Worker-9)       at no.kommuneforlaget.fagsystem.saksapp.jobs.ESBLogListener.checkESBEvents(ESBLogListener.java:71)
2011-02-08 09:53:30,668 ERROR [STDERR] (QuartzScheduler_Worker-9)       at no.kommuneforlaget.fagsystem.saksapp.jobs.ESBLogListener.scheduler(ESBLogListener.java:119)
2011-02-08 09:53:30,668 ERROR [STDERR] (QuartzScheduler_Worker-9)       at sun.reflect.GeneratedMethodAccessor466.invoke(Unknown Source)
2011-02-08 09:53:30,668 ERROR [STDERR] (QuartzScheduler_Worker-9)       at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
2

正しいクラスであるため、クラスキャスト例外であってはならないことはわかっています。

コードは次のとおりです。

SystemlogListener systemlogListener = (SystemlogListener) Component.getInstance("systemlogListener", ScopeType.SESSION, true);

そしてクラスは

@Name("systemlogListener")
@Scope(ScopeType.SESSION)
@AutoCreate
@Stateful
@TransactionManagement(TransactionManagementType.CONTAINER) //default
@TransactionAttribute(TransactionAttributeType.REQUIRES_NEW)
public class SystemlogListener implements SystemlogListenerLocal, Serializable {

誰かが私が犯した間違いを見つけることができますか?

4

1 に答える 1

2

Component.getInstance(...) が注入されたクラスを返すと仮定します。注入される実装は、実装のクラスである必要はなく、ローカル/リモート インターフェースのみである必要があります。したがって、インターフェイス SystemlogListenerLocal にキャストできますが、実装 SystemlogListener にはキャストできません。

その理由は、たとえばプロキシを使用し、メソッドを実際の実装に委任できる AppServer の実装です。

于 2011-02-08T09:10:13.933 に答える