Eclipse 无法解析抽象 class 类型的复合组件属性

Eclipse cannot resolve composite component attribute of abstract class type

即使 Eclipse 在 bolt_component.xhtml 中标记了 #{cc.attrs.bolt.spec.size} 行,因为 属性 无法为 spec.size

解析,代码似乎仍然有效

bolt_component.xhtml

<composite:attribute name="bolt" type="model.bolts.Bolt" />
#{cc.attrs.bolt.spec.size}

我的摘要class

public abstract class Bolt implements Serializable {
protected BoltSpec spec;
    I have setSpec()
    but not a getSpec()

和具体的class

public class BoltHexHead extends Bolt implements Serializable {

private static final long serialVersionUID = 1L;
private BoltSpecHexHead spec;

public BoltSpecHexHead getSpec() {
    return spec;
}
public void setSpec(BoltSpecHexHead spec) {
    this.spec = spec;
    super.setSpec(spec);
}

我知道为什么 Eclipse 会被标记,因为我没有 getSpec() 但是当我在 Bolt 中添加 getSpec 时,我在使用 HexHeadBolt 的控制器中得到一个空指针 .getSpec() 结果是空指针什么时候不应该。

if (analysisHexHeadWithNutOperational.getBolt().getSpec().getSize() == null) {

我尝试了多种 getters setters private protected 等组合...

Eclipse 的标记是错误吗?还是我的继承设置不正确?我正在使用 Luna

编辑

添加了屏幕截图,显示即使使用更清晰的 DRY 代码,使用参数化 属性,Eclipse 仍然标记 "size" 无法解析,但仅在自定义组件中

编辑2

通过将 spec 添加到 cc 接口,我可以让 Eclipse 停止标记

小资料

<stk:bolt_component boltTypes="#{data.hexHeadBoltTypes}"
         bolt="#{hex_head_nut_operational.boltAnalysis.bolt}"
         spec="#{hex_head_nut_operational.boltAnalysis.bolt.spec}" />

cc

composite:interface>
    <composite:attribute name="boltTypes" /> 
    <composite:attribute name="bolt" />
    <composite:attribute name="spec" />

我了解到您在弄清楚如何使用具有通用抽象螺栓规范的抽象螺栓时遇到了问题。在具有共同属性(和 getters/setters)的良好抽象 class 中,没有必要在每个子 class 中重复 getter/setter 并委托给 super .您 getSpec() 尝试中的错误可能是您没有委托给 super。而且,in subclass repeated spec 属性 是不必要的。

public BoltSpecHexHead getSpec() {
    return (BoltSpecHexHead) super.getSpec();
}

public void setSpec(BoltSpecHexHead spec) {
    super.setSpec(spec);
}

其实这不是DRY。如果抽象class的属性反过来也是抽象的,你想避免抛出地狱,那么你最好把它变成参数化类型。

public abstract class BoltSpec {

    // ...

}

public abstract class Bolt<S extends BoltSpec> {

    private S spec;

    public S getSpec() {
        return spec;
    }

    public void setSpec(S spec) {
        this.spec = spec;
    }

}

public class BoltSpecHexHead extends BoltSpec {

    // ...

}

public class BoltHexHead extends Bolt<BoltSpecHexHead> {

    // ... (note: no getSpec()/setSpec() necessary!)

}