簡體   English   中英

使用JSR223調用重載靜態方法時發生異常

[英]Exception when calling overloaded static method using JSR223

我正在嘗試使用JSR223( https://github.com/openhab/openhab/wiki/Jsr223-Script-Engine )在Javascript中實現openHAB( http://www.openhab.org/ )的規則。

是否有人提出以下異常的根本原因? 請注意,作為參數傳遞的兩個實例都實現了在方法聲明中用作參數的接口。

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中實現了與規則差不多的異常。

我知道我在回答這個問題時是個壞人,但我偶然發現了它,無法抗拒。

該錯誤信息是明確的:您嘗試調用的Java方法org.openhab.core.persistence.extensions.PersistenceExtensions.changedSince(org.openhab.core.items.Item, org.joda.time.DateTime)GroupItem

這很有趣,因為GroupItem擴展了實現Item接口的GenericItem因此應該與方法簽名匹配。

for each(var item in ItemRegistry.getItems()) {您將從OpenHab項定義中獲取所有項,包括所有組。 您可能只想要真實的物品。 嘗試if (! item.members )過濾所有組。

暫無
暫無

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

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