Spring Thymeleaf - метод вызова службы Boolean для отображения элемента HTML - PullRequest
2 голосов
/ 21 апреля 2019

В моем HTML заголовка я отображаю меню UL / LI, где видимость одного из элементов LI зависит от вызова метода Service.

Я пробовал это:

HomeController

@Controller
public class HomeController {
    private static final Logger log = LogManager.getLogger(HomeController.class);

    @Autowired 
    private EtdService etdService;

    @GetMapping("/home")
    public String home(Model model) throws EtdException {

        model.addAttribute("tierTemplate", etdService.getTierTemplate());  
        // Also tried this explicitly
        model.addAttribute("etdService", etdService);
        return "home";
    }
}

Сервисный интерфейс (EtdService)

public interface EtdService {
  boolean isChangeUserAllowed();
}

Реализация сервиса (EtdServiceImpl)

@Component
public class EtdServiceImpl implements EtdService {

    @Override
    public boolean isChangeUserAllowed() {
        System.out.println("Got here");
        return false;
    }

}

HTML:

<li th:if="${@etdService.isChangeUserAllowed()}" class="nav-item dropdown" id="changeUserPanel" role="presentation">
<!-- ... Definition of this LI -- note can't put a new DIV in a UL list ... -->
</li>

Ошибка:

Caused by: org.springframework.beans.factory.NoSuchBeanDefinitionException: No bean named 'etdService' available
    at org.springframework.beans.factory.support.DefaultListableBeanFactory.getBeanDefinition(DefaultListableBeanFactory.java:772) ~[spring-beans-5.1.4.RELEASE.jar:5.1.4.RELEASE]
    at org.springframework.beans.factory.support.AbstractBeanFactory.getMergedLocalBeanDefinition(AbstractBeanFactory.java:1221) ~[spring-beans-5.1.4.RELEASE.jar:5.1.4.RELEASE]

Ответы [ 2 ]

2 голосов
/ 21 апреля 2019

Вы ссылаетесь на метод экземпляра в Thymeleaf. Вот два варианта:

1) Опишите его, добавив значение логического значения в модель:

@GetMapping("/home")
public String home(Model model) throws EtdException {

   //...
   model.addAttribute("isChangeUserAllowed", etdService.isChangeUserAllowed());
   return "home";
}

И в вашем HTML: th:if="${isChangeUserAllowed}"

Чтобы избежать NPE, вы можете альтернативно использовать #bools.isTrue(isChangeUserAllowed) или соответствующий метод в утилите bools.

Это предпочтительный путь и путь, по которому идет документация Thymeleaf. Очевидным преимуществом является то, что интерфейс теперь не привязан к сервису.

2) Вместо этого ссылаться на него статически (не рекомендуется):

Ошибка при попытке вызова метода из представления Thymeleaf Spring


В сторону: рекомендуемый способ - использовать инжектор конструктора вместо автоматической разводки.

1 голос
/ 22 апреля 2019

В дополнение к ответу bphilipnyc (установите прямое значение в модель),

model.addAttribute("isChangeUserAllowed", etdService.isChangeUserAllowed());

Если вам нужно глобализировать общие атрибуты модели безПовторно добавляя каждый раз, решение представляет собой класс @ControllerAdvice с @ModelAttribute, например,

/**
 * This class is used to globalize common Model Attributes without re-adding every time
 * The approach is to mark it as @ControllerAdvice to make it apply to every Controller method, 
 * and implement a @ModelAttribute Model-Adder to append to the model on every Controller method.
 */

// Makes the methods of this class apply to all Controller Request methods
@ControllerAdvice
public class GlobalController {

    @Autowired
    MyService myService;

    @ModelAttribute   // A Model Attribute Adder method
    public void setGlobalModelAttributes(HttpServletRequest request, Model model) {

        model.addAttribute("isChangeUserAllowed", myService.isChangeUserAllowed());
        model.addAttribute("currentUserFullName", myService.getCurrentUserFullName());

    }       
}

Еще несколько примеров

https://stackoverflow.com/a/33879102/1005607

https://www.baeldung.com/spring-mvc-and-the-modelattribute-annotation

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...