Mit der Version läuft es bei mir auch. Wahrscheinlich hatte ich schon einen aktuelleren Snapshot als du, deshalb lief es bei mir nicht. Reproduzierbarere Ergebnisse gibt es aber mit den stabilen Versionen 
Ich werde mal sehen, ob ich morgen zum Debuggen komme. Ich melde mich dann nochmal.
*** Edit ***
Ich habe jetzt doch etwas durchdebugged. Ein Fehler ist das Verhalten nicht, denn der UriComponentsBuilder findet den RequestParameter und fügt ihn dann zur URL hinzu.
Allerdings finde ich, dass man die Webadressen prinzipiell etwas REST-konformer aufbauen könnte. Und zwar so:
public String handleUserDeleteForm(
@PathVariable("uid") User user,
RedirectAttributes redirectAttributes) {
try {
if (user == null)
throw new NoSuchElementException();
userService.delete(user);
FlashMessage.SUCCESS.put(redirectAttributes, "user.delete.success");
} catch (RuntimeException e) {
logger.error("User not found", e);
FlashMessage.ERROR.put(redirectAttributes, "user.delete.failure");
}
return "redirect:/admin";
}```
Dabei holt SpringData übrigens den User transparent mittels Primärschlüssel aus der Datenbank und weist ihn dem Parameter user zu.
Da HTML bekannterweise keine Formulare mit der Methode DELETE unterstützt, gibt es den HiddenHttpMethodFilter, den man einfach in die Servlet-Filterliste einklinkt.
In Thymeleaf nutzt man im Formular einfach:
```html
<form th:method="delete" ...>
Dadurch wird das versteckte Feld generiert, in dem die Übertragungsmethode übermittelt wird.
Das selbe gilt für das Erstellen eines Nutzers, das sollte per POST auf /admin/users geschehen.
Prinzipiell fände ich es gut, wenn die Seiten etwas REST-konformer gegliedert wären. Dazu müsste man sich einmal genauer Gedanken machen, welche Ressourcen es überhaupt gibt.
Berechtigungen wären dann auch unter /admin/users/{uid}/rights zu finden. Mit der Methode PUT könnte man die Berechtigungen als Set setzen. Einzelberechtigungen könnte man ggf. über DELETE auf /admin/users/{uid}/rights/{right} löschen, das wäre aber eigentlich redundant.
*** Edit ***
Ach so, in Thymeleaf sollten konstante URLs immer mit dem @ angegeben werden, damit auch ein alternatives Servlet-Präfix funktioniert. Also th:action="@{/admin/userDelete}"
Mit dem REST-konformen URL-Aufbau sähe das Formular ungefähr so aus:
<form role="form" th:action="@{/admin/users/{uid}(uid=${user.id})}" th:method="delete">
<button type="button" class="btn btn-default" data-dismiss="modal">Close
</button>
<button type="submit" class="btn btn-primary">Delete User</button>
</form>
Den oben genannten HiddenHttpMethodFilter registriert SpringBoot scheinbar schon bei der Autokonfiguration.
Mit dem MvcUriComponentsBuilder gibt es offensichtlich noch einige Querälen in Bezug auf SpringDatas transparentes Laden der Entities. Denn wenn man den URL bauen möchte, schlägt das wegen des Type-Mismatch (int vs. User) fehl.
Ob man das beheben kann oder wo man da am besten ansetzt, muss ich noch einmal in einer ruhigen Minuten herausfinden.