Frage

Ich versuche, in Thymeleaf ein rekursives Fragment zu erstellen, um ein Menü auf der linken Seite zu erstellen.Die Kernarchitektur ist Spring Boot, und ich übergebe ein gefülltes Menu-Objekt, das untergeordnete Elemente usw. hat.Der Code für das Menü sieht so aus:

public class MenuItem {
    private String displayLabel;
    private String actionUri;

    private List<MenuItem> children;

    // ...getters/setters/etc...
}

Und ein Thymeleaf-Fragment, definiert wie:

<!DOCTYPE HTML>
<html xmlns:th="http://www.thymeleaf.org">
<head>
<title>Menu</title>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
</head>
<body>
    <div th:fragment="submenu (menu)" th:remove="tag">
        <ul th:if="${not #lists.isEmpty(menu.children)}" th:class="${#objects.nullSafe(depth, 1) &gt; 1}? 'children'">
            <li th:each="child : ${menu.children}">
                <span th:if="${#strings.isEmpty(child.actionUri)}" th:text="${child.displayLabel}">Addons</span>
                <a th:if="${not #strings.isEmpty(child.actionUri)}" th:href="${child.actionUri}" th:text="${child.displayLabel}">Link Item</a>
                <div th:replace="fragments/submenu :: submenu(menu=${child}, depth=depth+1)" th:remove="tag" />
            </li>
        </ul>
    </div>
</body>
</html>

Wenn ich das nehme depth Code raus, alles scheint gut zu funktionieren.Aber damit bekomme ich:

2014-07-30 11:13:00.832 ERROR 45869 --- [nio-8080-exec-4] o.a.c.c.C.[.[.[/].[dispatcherServlet]    : Servlet.service() for servlet [dispatcherServlet] in context with path [] threw exception [Request processing failed; nested exception is org.thymeleaf.exceptions.TemplateProcessingException: Exception evaluating SpringEL expression: "#objects.nullSafe(depth, 1) > 1" (fragments/submenu:9)] with root cause

java.lang.ClassCastException: java.lang.Integer cannot be cast to java.lang.String

Der Zweck der depth Der Code dient dazu, dass ich optional eine Klasse einfügen kann, um zu verfolgen, wann Menüelemente dem übergeordneten Element untergeordnet sind.Ist es möglich, entweder den Tiefenzähler zu reparieren oder etwas anderes zu tun, um zu testen, ob das Fragment bereits ausgeführt wurde?Letztendlich möchte ich nur ein rekursives Menü mit der Spitze ul keine Klasse und kein Kind haben ulIch habe eine Klasse von children.

War es hilfreich?

Lösung

Probieren Sie diese Änderungen aus

1.Verwenden Sie zwei Parameter im Fragment als

<div th:fragment="submenu (menu, depth)" >

2. Übergeben Sie die Tiefe als

<div th:replace="fragments/submenu :: submenu(menu=${child}, depth=${depth+1})"  />
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top