Habe das ganze gebaut und nach 5 Minuten war dann auch Spring auf dem Rechner.
Eine Lösung auch wenn nicht wirklich die schönste kann ich dir in dieser Form anbieten:
<td><input type="checkbox" name="role" th:value="${r.name}"
th:checked="${user.roles.toString().contains(r.name)}"/>
</td>
<td th:text="${r.name} + ' -- ' + ${user.roles.toString().contains(r.name)}+' -- ' + ${user.roles.toString()}">
ROLE_USER
</td>
Vielleicht finde ich ja noch was passenderes. Aber die Daten sind zumindest schon einmal vorhanden.
*** Edit ***
Da der User erstmal nur eine Rolle hat, hole ich mir auch erstmal nur eine Rolle, bevor ich mich an contains mache.
${#lists.toList(user.roles).get(0).getId().equals(r.getId())}
=> true, an der entsprechenden Stelle
${#lists.toList(user.roles).get(0).equals(r)}
=> false, an der Stelle
Also mal equals debuggen
public boolean equals(Object o) {
System.out.println("Comparing: "+this+" with "+o);
if (this == o) return true;
if (o == null || !(o instanceof Role)) return false;
Role role = (Role) o;
return id != null && id.equals(role.id);
}```
Mit dem Ergebnis:
Comparing: ROLE_OWNER with 1
Comparing: ROLE_OWNER with 2
Comparing: ROLE_OWNER with 3
Comparing: ROLE_OWNER with 4
Comparing: ROLE_OWNER with 5
Boom!!!
Aber wird noch krasser
Mal das equals umdrehen:
${r.equals(#lists.toList(user.roles).get(0))}
Comparing: ROLE_USER with 4
Comparing: ROLE_MODERATOR with 4
Comparing: ROLE_ADMINISTRATOR with 4
Comparing: ROLE_OWNER with 4
Comparing: ROLE_GUEST with 4
WTF!!!
Also mal Datentypen anschauen
```@Override
public boolean equals(Object o) {
System.out.println("Comparing: "+this+" with "+o);
System.out.println(this.getClass()+" vs "+o.getClass());
if (this == o) return true;
if (o == null || !(o instanceof Role)) return false;
Role role = (Role) o;
return id != null && id.equals(role.id);
}```
class org.fjorum.model.entity.Role vs class java.lang.Long
Also nochmal im Template die Klassen ausgeben lassen
`${r.getClass()} + ' -- ' + ${#lists.toList(user.roles).get(0).getClass()}`
Ergebnis auf der Seite:
`class org.fjorum.model.entity.Role -- class org.fjorum.model.entity.Role`
Im Template ist es noch eine Rolle, bei equals kommt allerdings nur ein Long an.
Und das meine Damen und Herren, war es dann jetzt erstmal vorerst.
*** Edit ***
So, das einzige was ich nach zahlreichen Versuchen noch finden konnte war eine eigene Helper Methode, die ich mal in Role gepackt habe.
``` public boolean contained(java.util.Collection c) {
boolean result = c.contains(this);
return result;
}```
um dann damit den Haken zu setzen
`th:checked="${r.contained(user.roles)}"`
Habe auch einen Versuch mit einer "arrays" gemacht, der zwar zu gehen scheint, den ich allerdings nicht ganz verifizieren kann. Möglicherweise wird hier auf den index gegangen oder sonst etwas verglichen. :ka:
`th:checked="${#arrays.contains(#arrays.toArray(user.roles), r)}"`