Использовать тимилеф шаблон другого проекта - PullRequest
0 голосов
/ 02 июля 2019

Кажется, есть проблема, если использовать thymeleaf для нескольких проектов.

Допустим, у меня есть приложение spring в проекте 2 и контроллер в проекте 1. С соответствующим @ComponentScan определено, что приложение может отображатьпросмотреть / HTML в моей папке шаблонов.Но после того, как я добавил maven-зависимость thymeleaf-layout-dialect, произошел сбой: «Произошла непредвиденная ошибка (type = Not Found, status = 404)».ошибка.

Мои проекты:

structure

Prj1 pom.xml:

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
  <modelVersion>4.0.0</modelVersion>
  <groupId>macrohard.org</groupId>
  <artifactId>prj1</artifactId>
  <version>0.0.1-SNAPSHOT</version>

    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.1.4.RELEASE</version>
        <relativePath/> 
    </parent>

 <dependencies>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
    </dependency>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-thymeleaf</artifactId>
    </dependency>
    <dependency>
        <groupId>nz.net.ultraq.thymeleaf</groupId>
        <artifactId>thymeleaf-layout-dialect</artifactId>
    </dependency>

</dependencies>
</project>

Prj2 pom.xml:

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
  <modelVersion>4.0.0</modelVersion>
  <groupId>macrohard.org</groupId>
  <artifactId>prj2</artifactId>
  <version>0.0.1-SNAPSHOT</version>

  <dependencies>
    <dependency>
        <groupId>macrohard.org</groupId>
        <artifactId>prj1</artifactId>
        <version>0.0.1-SNAPSHOT</version>
    </dependency>
  </dependencies>
</project>

The hello-world.html:

<!DOCTYPE html>
<html>
<head>
<meta charset="ISO-8859-1">
<title>HW</title>
</head>
<body>
    Hello World!!
</body>
</html>

Приложение 2 в prj2:

package prj2;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.annotation.ComponentScan;

@SpringBootApplication
@ComponentScan(basePackages = { "prj1"} )
public class App2 {
    public static void main(String[] args) {
        SpringApplication.run(App2.class, args);
    }
}

Контроллер1 в prj1

package prj1.web;

import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.servlet.ModelAndView;

@RestController
@RequestMapping(value="/api")
public class Controller1 {

    // this can be run by App2 & App1
    @GetMapping(value="/hello")
    public String hello() {
        return "hello world";
    }

    // this can be run by App1 only
    @GetMapping(value="/hello2")
    public ModelAndView hello2() {
        ModelAndView mav = new ModelAndView();
        mav.setViewName("hello-world");
        return mav;
    }

}

Как и в Controller1, «api / hello» может быть успешно запрошен, потому что он не включает шаблон.Но для запроса "api / hello2" он не может отобразить hello-world.html.Вот стеки ошибок:

2019-07-02 22:21:28.758  INFO 19680 --- [           main] prj2.App2                                : Started App2 in 1.89 seconds (JVM running for 2.454)
2019-07-02 22:21:51.807  INFO 19680 --- [nio-8080-exec-1] o.a.c.c.C.[Tomcat].[localhost].[/]       : Initializing Spring DispatcherServlet 'dispatcherServlet'
2019-07-02 22:21:51.807  INFO 19680 --- [nio-8080-exec-1] o.s.web.servlet.DispatcherServlet        : Initializing Servlet 'dispatcherServlet'
2019-07-02 22:21:51.807 TRACE 19680 --- [nio-8080-exec-1] o.s.web.servlet.DispatcherServlet        : Detected org.springframework.web.multipart.support.StandardServletMultipartResolver@2ded92
2019-07-02 22:21:51.810 TRACE 19680 --- [nio-8080-exec-1] o.s.web.servlet.DispatcherServlet        : No LocaleResolver 'localeResolver': using default [AcceptHeaderLocaleResolver]
2019-07-02 22:21:51.811 TRACE 19680 --- [nio-8080-exec-1] o.s.web.servlet.DispatcherServlet        : No ThemeResolver 'themeResolver': using default [FixedThemeResolver]
2019-07-02 22:21:51.814 TRACE 19680 --- [nio-8080-exec-1] o.s.web.servlet.DispatcherServlet        : No RequestToViewNameTranslator 'viewNameTranslator': using default [DefaultRequestToViewNameTranslator]
2019-07-02 22:21:51.817 TRACE 19680 --- [nio-8080-exec-1] o.s.web.servlet.DispatcherServlet        : No FlashMapManager 'flashMapManager': using default [SessionFlashMapManager]
2019-07-02 22:21:51.817 DEBUG 19680 --- [nio-8080-exec-1] o.s.web.servlet.DispatcherServlet        : enableLoggingRequestDetails='false': request parameters and headers will be masked to prevent unsafe logging of potentially sensitive data
2019-07-02 22:21:51.817  INFO 19680 --- [nio-8080-exec-1] o.s.web.servlet.DispatcherServlet        : Completed initialization in 10 ms
2019-07-02 22:21:51.829 TRACE 19680 --- [nio-8080-exec-1] o.s.web.servlet.DispatcherServlet        : GET "/api/hello2", parameters={}, headers={masked} in DispatcherServlet 'dispatcherServlet'
2019-07-02 22:21:51.834 TRACE 19680 --- [nio-8080-exec-1] s.w.s.m.m.a.RequestMappingHandlerMapping : Mapped to public org.springframework.web.servlet.ModelAndView prj1.web.Controller1.hello2()
2019-07-02 22:21:51.843 TRACE 19680 --- [nio-8080-exec-1] .w.s.m.m.a.ServletInvocableHandlerMethod : Arguments: []
2019-07-02 22:21:51.851 DEBUG 19680 --- [nio-8080-exec-1] o.s.w.s.v.ContentNegotiatingViewResolver : Selected 'text/html' given [text/html, application/xhtml+xml, image/webp, image/apng, application/signed-exchange;v=b3, application/xml;q=0.9, */*;q=0.8]
2019-07-02 22:21:51.851 TRACE 19680 --- [nio-8080-exec-1] o.s.web.servlet.DispatcherServlet        : Rendering view [org.springframework.web.servlet.view.InternalResourceView: name 'hello-world'; URL [hello-world]] 
2019-07-02 22:21:51.851 DEBUG 19680 --- [nio-8080-exec-1] o.s.w.servlet.view.InternalResourceView  : View name 'hello-world', model {}
2019-07-02 22:21:51.853 DEBUG 19680 --- [nio-8080-exec-1] o.s.w.servlet.view.InternalResourceView  : Forwarding to [hello-world]
2019-07-02 22:21:51.857 TRACE 19680 --- [nio-8080-exec-1] o.s.web.servlet.DispatcherServlet        : "FORWARD" dispatch for GET "/api/hello-world", parameters={}, headers={masked} in DispatcherServlet 'dispatcherServlet'
2019-07-02 22:21:51.860 TRACE 19680 --- [nio-8080-exec-1] o.s.w.s.handler.SimpleUrlHandlerMapping  : Mapped to HandlerExecutionChain with [ResourceHttpRequestHandler ["classpath:/META-INF/resources/", "classpath:/resources/", "classpath:/static/", "classpath:/public/", "/"]] and 3 interceptors
2019-07-02 22:21:51.862 DEBUG 19680 --- [nio-8080-exec-1] o.s.w.s.r.ResourceHttpRequestHandler     : Resource not found
2019-07-02 22:21:51.862 TRACE 19680 --- [nio-8080-exec-1] o.s.web.servlet.DispatcherServlet        : No view rendering, null ModelAndView returned.
2019-07-02 22:21:51.862 DEBUG 19680 --- [nio-8080-exec-1] o.s.web.servlet.DispatcherServlet        : Exiting from "FORWARD" dispatch, status 404, headers={}
2019-07-02 22:21:51.864 DEBUG 19680 --- [nio-8080-exec-1] o.s.web.servlet.DispatcherServlet        : Completed 404 NOT_FOUND, headers={}
2019-07-02 22:21:51.865 TRACE 19680 --- [nio-8080-exec-1] o.s.web.servlet.DispatcherServlet        : "ERROR" dispatch for GET "/error", parameters={}, headers={masked} in DispatcherServlet 'dispatcherServlet'
2019-07-02 22:21:51.865 TRACE 19680 --- [nio-8080-exec-1] s.w.s.m.m.a.RequestMappingHandlerMapping : 2 matching mappings: [{ /error, produces [text/html]}, { /error}]
2019-07-02 22:21:51.866 TRACE 19680 --- [nio-8080-exec-1] s.w.s.m.m.a.RequestMappingHandlerMapping : Mapped to public org.springframework.web.servlet.ModelAndView org.springframework.boot.autoconfigure.web.servlet.error.BasicErrorController.errorHtml(javax.servlet.http.HttpServletRequest,javax.servlet.http.HttpServletResponse)
2019-07-02 22:21:51.875 TRACE 19680 --- [nio-8080-exec-1] .w.s.m.m.a.ServletInvocableHandlerMethod : Arguments: [org.apache.catalina.core.ApplicationHttpRequest@6fdc83, org.apache.catalina.connector.ResponseFacade@119a78b]
2019-07-02 22:21:51.885 DEBUG 19680 --- [nio-8080-exec-1] o.s.w.s.v.ContentNegotiatingViewResolver : Selected 'text/html' given [text/html, text/html;q=0.8]
2019-07-02 22:21:51.886 TRACE 19680 --- [nio-8080-exec-1] o.s.web.servlet.DispatcherServlet        : Rendering view [org.springframework.boot.autoconfigure.web.servlet.error.ErrorMvcAutoConfiguration$StaticView@216e30] 
2019-07-02 22:21:51.908 DEBUG 19680 --- [nio-8080-exec-1] o.s.web.servlet.DispatcherServlet        : Exiting from "ERROR" dispatch, status 404, headers={}

Я уверен, что это происходит из-за thymeleaf-layout-dialect, потому что, если я удаляю его из pom.xml, все работает нормально.Проблема в том, что я нуждаюсь в макете страницы тимьянаКак отобразить шаблон в другом проекте, отличном от весеннего приложения?

Ответы [ 2 ]

1 голос
/ 03 июля 2019

Поскольку вы опубликовали пример проекта, я не могу следить за проблемой: /

Вы уверены, что не просто перепутали сообщения "hello world" от контроллера с сообщением из шаблона?

Когда я изменяю: \prj1\src\main\resources\templates\hello-world.html

<!DOCTYPE html>
<html>
<head>
<meta charset="ISO-8859-1">
<title>HW</title>
</head>
<body>
    Hello World!! (from Template in prj1)!
</body>
</html>

Мне пришлось добавить это в pom.xml prj1 из-за какой-то странной проблемы с classpath: (используемая вами библиотека thymeleaf-layout-dialect libкажется, приносит дополнительную банку тимьяна - не исследовал это)

 <dependency>
     <groupId>org.thymeleaf</groupId>
     <artifactId>thymeleaf</artifactId>
     <version>3.0.11.RELEASE</version>
 </dependency>

Когда я запускаю приложение prj2 и звоню: http://localhost:8080/api/hello3 или http://localhost:8080/api/hello2, я получаю:

Hello World!! (from Template in prj1)!

Что нам нужно?

Когда я звоню: http://localhost:8080/api/hello Я получаю сообщение об ошибке из-за какого-то не найденного шаблона («hello world», конечно, не файл шаблона).

ИтакЯ не уверен, почему это не работает для вас: /

0 голосов
/ 02 июля 2019

Я не уверен, как это работает без этой зависимости. Контроллеры, работающие с шаблонами, могут возвращать имя шаблона напрямую. И вы реализуете остальные контроллеры, которые предлагают значения по умолчанию, отличные от требуемых для работы с шаблонами (например, с типами содержимого).

Таким образом, контроллер, который будет вызывать шаблон, выглядит следующим образом (это мой способ сделать это, не могу утверждать, что я знаю его единственный):

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;

@Controller
public class MyController {

    @Autowired
    public MyController() {
    }

    @RequestMapping("/hello-world")
    public String hello(Model model) {

        model.addAttribute("someKey", "someValue");
        return "hello-world"; // this is the template name in src/main/resources
    }

}

И таким образом также возможно объединить контроллеры / шаблоны в один jar и использовать их в другом приложении для весенней загрузки в качестве зависимостей. Поскольку все это основано на classpath (, есть свойство для настройки этого : spring.thymeleaf.prefix), это просто работает для меня.

Думаю, причина в том, что ты действительно контролируешь покой, что может немного запутать.

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