Как передать определенный объект фрагменту (thymelaf)

#spring #spring-boot #spring-mvc #thymeleaf

#spring #spring-загрузка #spring-mvc #thymeleaf

Вопрос:

У меня проблема, с которой я хотел бы получить помощь!

Я использую Intellij Idea и использую Spring MVC с Thymeleaf. Я создал фрагмент, и все в порядке, он работает хорошо и импортируется в мой текущий HTML-файл.

 <div th:replace="fragments/ModalCart :: modal(${products.get(0)})"></div>
  

Это мой статус импорта, и, как вы можете видеть, я передаю один объект типа Product .

Это мой фрагмент HTML-файла

 <!DOCTYPE html>
<html lang="en" xmlns:th="http://www.thymeleaf.org">
<head>
    <meta charset="UTF-8">
</head>
<body>
<div th:fragment="modal(product)">
    <button id="myBtn">Open Modal</button>
    <div id="myModal" class="modal">
        <div class="modal-content">
            <section class="card">
                <div class="columns">
                    <div class="column">
                        <p th:text="${product.getImgUrl()}"></p>
                    </div>
                </div>
            </section>
        </div>
    </div>
</div>


</body>
</html>
  

Моя проблема в том, что мой «продукт» в модальном фрагменте имеет тип, а Object не тип, Product каким я хотел бы быть (из-за этого, если я вызываю imgUrl метод получения для переданного в продукте, я получаю красное подчеркивание, которое говорит мне, что он не может быть разрешен, даже если он работает, у меня естьошибка в моем HTML-файле, которая раздражает).
Как мне убедиться, что параметр, который передается в этот класс, имеет тип Product class, а не java.lang.Object class ?

Есть ли какой-нибудь способ вернуть его обратно в a Product или я застрял?

Спасибо

Комментарии:

1. Переменные предоставляются шаблону, с org.springframework.ui.Model которым String нужно Object хранить. Я думаю, как только вы добавите свою переменную в модель, ее тип станет неактуальным.

Ответ №1:

Thymeleaf на самом деле не заботится о типе переменной, передаваемой фрагменту, поэтому ${product.getImgUrl()} (эквивалентно ${product.imgUrl} ) должно работать независимо от того, имеет ли он красные подчеркивания.

Что касается устранения этих проблем … это зависит от среды IDE. Например, в Intellij я думаю, что что-то вроде этого должно работать:

 <div th:fragment="modal(product)">
  <!--/*@thymesVar id="product" type="your.package.Product"*/-->
  

Где вы your.package.Product заменяете свой фактический пакет.

Комментарии:

1. Отличный ответ! В моей Intellij IDEA 2021.2 строка комментария должна быть помещена поверх th:fragment строки. И шаблон /* */ comment в комментарии xml не так уж и нужен.

2. @RickoD Я думаю /* ... */ , что часть делает это комментарием thymeleaf, который не выводится в HTML (в противном случае вы рискуете раскрыть имена объектов — если это имеет значение).

3. Спасибо за исправление, я поместил фрагмент в отдельный файл, который не отображается как страница, и разместил комментарий снаружи (выше) элемента fragment, поэтому я не заметил его, когда ссылался на него