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

时间:2016-01-13 00:14:35

标签: java eclipse jsf abstract-class composite-component

即使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}

我的抽象类

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

和具体的课程

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()结果为null不应该。

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

我尝试过多种getter setters私人保护组合......

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

修改

添加截图显示即使使用更干净的DRY代码,使用参数化属性,日食仍然标记“大小”无法解析,但仅在自定义组件中 enter image description here

EDIT2

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

faclet

<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" />

1 个答案:

答案 0 :(得分:1)

我认为你很难弄清楚如何使用带有通用抽象螺栓规格的抽象螺栓。在具有公共属性(和getter / setter)的良好抽象类中,不必在每个子类中重复getter / setter并委托给supergetSpec()尝试中的错误很可能是您未委托给super。而且,子类重复spec属性是不必要的。

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

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

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

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!)

}