Optaplanner IllegalArgumentException:valueRangeProviderRef 没有出现在 valueRangeProvideIds 中

Optaplanner IllegalArgumentException: The valueRangeProviderRef does not appear in valueRangeProvideIds

使用规划实体中定义的布尔规划变量为:

@PlanningVariable(nullable = true, valueRangeProviderRefs = {"selectedRange"})
public Boolean getSelected() {
    return selected;
}

public void setSelected(Boolean selected) {
    this.selected = selected;
}

并且在规划解决方案中我将值范围提供者定义为:

@ValueRangeProvider(id = "selectedRange")
List<Boolean> getValueRange() {
     return Arrays.asList(Boolean.FALSE, Boolean.TRUE);
}
public List<Boolean> getBooleanList() {
    return selectedList;
}

public void setBooleanList(List<Boolean> selectedList) {
    this.selectedList = selectedList;
}

我收到以下错误:

Exception in thread "AWT-EventQueue-0"
java.lang.IllegalArgumentException:

The entityClass has a PlanningVariable annotated property (selected) with a valueRangeProviderRef (selectedRange) that does not exist on a registered PlanningSolution or PlanningEntity.

The valueRangeProviderRef (selectedRange) does not appear in valueRangeProvideIds ([]).

我无法识别问题原因。

通常我会说:您的解决方案 class 在 属性 上遗漏了 @ValueRangeProvider。但看起来你有它。出于某种原因,当它反映在您的规划解决方案中时,它只是没有接受它 class。

A) 如果您使用的是 6.3.0.Final 或更高版本,您的代码应该可以工作。如果您使用的是旧版本,可能是因为 getValueRange() 方法不是 public(6.3 修复了 IIRC)。

B) 如果 getValueRange() 方法是在 superclass 而不是实际规划解决方案 class 上定义的,那么只有当 superclass 时它才会起作用] 也被称为适当的规划解决方案 class IIRC。