Rozróżnianie typu obiektu w JSP

0

Kontroler zwraca obiekty klasy Switch, oraz obiekty dziedziczące po tej klasie np. SwitchDim

    @RequestMapping(value = {"/lights"}, method = RequestMethod.GET)
    public String lights(Model model) {
        model.addAttribute("lights", ACTIVE);
        List<Switch> switches = switchRep.findAllSwitchesByTypeLastSeen(MicrocontrollerVariables.TYPE_INDOOR, MicrocontrollerVariables.getDefaultDelay());
        model.addAttribute("indoorSwitchList", switches);
        return "lights";
    }

Klasa Module:

@Data
@Entity
@Inheritance(strategy = InheritanceType.SINGLE_TABLE)
@JsonTypeInfo(
        use = JsonTypeInfo.Id.NAME,
        property = "type")
@JsonSubTypes({
        @Type(value = Switch.class, name = "switch"),
        @Type(value = TemperatureSensor.class, name = "temperatureSensor"),
        @Type(value = HumiditySensor.class, name = "humiditySensor")
})
public abstract class Module {
    @Id
    @GeneratedValue
    private Integer id;
    @Column(nullable = false)
    private Integer internalId;
    @Column(nullable = false)
    private String label;
    public Module() {}
    public Module(Integer internalId, String label) {
        this.internalId = internalId;
        this.label = label;
    }
...
}

Klasa Switch dziedzicząca po Module

@Data
@Entity
public class Switch extends Module {
    private Boolean isOn;
    public Switch () {super();}
    public Switch (Integer internalId ,String label, Boolean isOn)
    {
        super(internalId, label);
        this.isOn = isOn;
    }
...
}

Klasa SwitchDim dziedzicząca po Switch

@Data
@Entity
public class SwitchDim extends Switch {
    @Range(min=0,max=100)
    private int dim;
    public SwitchDim () {super();}

    public SwitchDim(int internalId, String label, boolean isOn, int dim) {
        super(internalId ,label, isOn);
        this.dim = dim;
    }
...
}

Jak rozróżnić w JSP, który obiekt jest jakiego typu?

Przykładowo mam taką pętle w JSP:

<c:forEach items="${indoorSwitchList}" var="indoorSwitch">
         <h5>${indoorSwitch.label}</h5>
</c:forEach>

Gdy wywołam ${indoorSwitch.dim} podczas wejścia na stronę wywali błędem, ponieważ nie ma takiego pola w obiekcji klasy Switch, tylko SwitchDim, a kontroler zawraca oba typy obiektów.
Nie chce w kontrolerze robić oddzielnych list dla każdej klasy pochodnej. Ponieważ później gdy stworzę dodatkową klasę pochodną będę musiał aktualizować kontroler.
W przypadku konwersji wszystkich obiektów klasy Module na JSON, widzialna jest kolumna type która oznacza type obiektu.

0
  1. Możesz zrobić własną bibliotekę tagów, która będzie Ci zwracała pustą wartość dla atrybutów, których w beanie nie ma...
  2. Możesz spróbować ${foo.class.name} i porównywać czy to Switch, czy SwitchDim... i odwoływać się do odpowiedniego atrybuty
  3. Możesz spróbować skryptletów:
<%
 if (obiekt instanceof SwitchDim) { 
%>
  1. Ładujesz dane do widoku, to dostarczaj to co w widoku potrzebne. Możesz zrobić klasę, która będzie przenosiła do widoku to co potrzebne i będziesz miał wówczas List<SwitchData> i tam upakujesz wszystkie potrzebne atrybuty. Obejdzie się bez takich obejść 1-3.

1 użytkowników online, w tym zalogowanych: 0, gości: 1