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.