簡體   English   中英

使用Java接口實現OSGI服務時,Scala,VerifyError

[英]Scala, VerifyError when implementing OSGI service with Java interface

Java抽象類:

public abstract class ActionProcessorExtensionPoint<A extends Action<?>> extends ExtensionPoint

public abstract class ActionProcessorExtensionBase<A extends Action<?>> extends ActionProcessorExtensionPoint<A> {
    protected final Log log = LogFactory.getLog(getClass());
    private final Set<Class<? extends A>> supportedClasses; 

    public ActionProcessorExtensionBase(Class<? extends A> actionClass) {
        supportedClasses = computeClasses(actionClass);
    }

}

Scala類:

@Component(immediate = true)
@Provides(specifications = Array(classOf[ActionProcessorExtensionPoint[_ <:Action[T] forSome {type T}]]))
@Instantiate
class ActionPolicyDefinitionCreateProcessorExtension(
  val actionClass: Class[ActionPolicyDefinitionCreate]
) extends ActionProcessorExtensionBase[ActionPolicyDefinitionCreate](actionClass) { 

    def this() {
      this(classOf[ActionPolicyDefinitionCreate])
    }
 }

錯誤:

[ActionPolicyDefinitionCreateProcessorExtension-0] createInstance -> The POJO constructor invocation failed : Bad type on operand stack



Exception Details:

 Location:

   ActionPolicyDefinitionCreateProcessorExtension.<init>(Lorg/apache/felix/ipojo/InstanceManager;Ljava/lang/Class;)V @2: invokevirtual

 Reason:

   Type uninitializedThis (current frame, stack[0]) is not assignable to 'ActionPolicyDefinitionCreateProcessorExtension'

 Current Frame:

   bci: @2

   flags: { flagThisUninit }

   locals: { uninitializedThis, 'org/apache/felix/ipojo/InstanceManager', 'java/lang/Class' }

   stack: { uninitializedThis, 'java/lang/Class' }

 Bytecode:

   0x0000000: 2a2c b600 f02a 2cb7 00f2 2a2b b700 f6b1

   0x0000010:                                        

java.lang.VerifyError: Bad type on operand stack Exception Details: Location: ActionPolicyDefinitionCreateProcessorExtension.<init>(Lorg/apache/felix/ipojo/InstanceManager;Ljava/lang/Class;)V @2: invokevirtual 

問題在於ActionPolicyDefinitionCreateProcessorExtension,因為它是IPOJO組件,所以不應具有帶有參數的構造函數。 該解決方案將其重寫為:

@Component(immediate = true)
@Provides(specifications = Array(classOf[ActionProcessorExtensionPoint[_ <:Action[T] forSome {type T}]]))
@Instantiate
class ActionPolicyDefinitionCreateProcessorExtension
  extends ActionProcessorExtensionBase[ActionPolicyDefinitionCreate](classOf[ActionPolicyDefinitionCreate]) { ... }

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM