2015-10-29 4 views
1

Я пытаюсь реализовать правило для openHAB (http://www.openhab.org/) в Javascript, используя JSR223 (https://github.com/openhab/openhab/wiki/Jsr223-Script-Engine).Исключение при вызове перегруженного статического метода с использованием JSR223

Кто-нибудь имеет предложение об основной причине следующего исключения? Обратите внимание, что оба экземпляра, переданные как аргумент, реализуют интерфейсы, используемые в качестве параметров в объявлении метода.

java.lang.RuntimeException: java.lang.NoSuchMethodException: None of the fixed arity signatures [(org.openhab.core.items.Item, org.joda.time.base.AbstractInstant)] of method org.openhab.core.persistence.extensions.PersistenceExtensions.changedSince match the argument types [org.openhab.core.items.GroupItem, org.joda.time.DateTime] 
     at jdk.nashorn.javaadapters.java.util.function.Consumer.accept(Unknown Source) ~[na:na] 
     at java.util.ArrayList.forEach(ArrayList.java:1249) ~[na:1.8.0_31] 
     at jdk.nashorn.internal.scripts.Script$\^eval\_.L:13(<eval>:14) ~[na:na] 
     at org.openhab.core.jsr223.internal.shared.Rule$$NashornJavaAdapter.execute(Unknown Source) ~[na:na] 
     at org.openhab.core.jsr223.internal.engine.RuleExecutionRunnable.run(RuleExecutionRunnable.java:36) ~[na:na] 
     at java.lang.Thread.run(Thread.java:745) [na:1.8.0_31] 

Ниже реализованный сценарий:

'use strict'; 

load("nashorn:mozilla_compat.js"); 
importPackage(org.openhab.core.jsr223.internal.shared); 
importPackage(org.joda.time); 
importPackage(org.joda.time.base); 


var autoOffRule = new org.openhab.core.jsr223.internal.shared.Rule() { 
    getEventTrigger: function() { 
     return [ 
      new org.openhab.core.jsr223.internal.shared.TimerTrigger("* * * * * ?") 
     ]; 
    }, 
    execute: function(event) { 
     for each(var item in ItemRegistry.getItems()) { 
      if (item.getState() == org.openhab.core.library.types.OnOffType.ON) { 
       var dateTime = org.joda.time.DateTime.now().withFieldAdded(DurationFieldType.seconds(), -5); 

       if (!(org.openhab.core.persistence.extensions.PersistenceExtensions.class.static.changedSince(item, var dateTime))) { 
        print("Auto-off for " + item.getName()) 
       } 
      }    
     } 
    } 
}; 

function getRules() { 
    return new org.openhab.core.jsr223.internal.shared.RuleSet([ autoOffRule ]); 
} 

Вызываемый метод перегружен и имеет следующие подписи:

org.openhab.core.persistence.extensions.PersistenceExtensions#changedSince(org.openhab.core.items.Item, org.joda.time.base.AbstractInstant) 
org.openhab.core.persistence.extensions.PersistenceExtensions#changedSince(org.openhab.core.items.Item, org.joda.time.base.AbstractInstant, java.lang.String) 

Испытано и неудачу как на jdk1.8.0_31 и jdk1.8.0 _65. Включение в более или менее аналогичное исключение, имеющее правило, реализованное в Groovy.

ответ

0

Я знаю, что я некромантик, отвечая на этот вопрос, но наткнулся на него и не смог удержаться.

Сообщение об ошибке ясно: вы пытаетесь вызвать Java-метод org.openhab.core.persistence.extensions.PersistenceExtensions.changedSince(org.openhab.core.items.Item, org.joda.time.DateTime) с помощью GroupItem.

Which is interesting since a GroupItem extends the GenericItem which implements the Item Interface и поэтому должны соответствовать методу подписи.

С for each(var item in ItemRegistry.getItems()) { вы получаете все предметы из вашего определения позиции OpenHab, включая все группы. Вам, вероятно, нужны только реальные предметы. Попробуйте if (! item.members), чтобы отфильтровать все группы.