Spring boot не обслуживает статический контент (angular-cli) для обслуживания приложения на tomcat - PullRequest
0 голосов
/ 07 сентября 2018

Я борюсь с проблемой, когда spring-boot не обслуживает интерфейсные файлы (созданные с помощью angular) на 8080. Я запустил ng build, который преобразовал файлы компонентов .ts ng в .js и сгенерировал в outputPath: / папка resource / static (я устанавливаю outputPath в файле angular.json). Создан контроллер для обслуживания контента из ресурсов / статических.

    @Controller
    public class AppController {
        @GetMapping("/")
        public String index() {
            return "index";
        }
     }

основной класс (src / mainjava / webapp / app):

@Configuration
@EnableAutoConfiguration
@ComponentScan({"webapp"})
public class Application extends WebMvcAutoConfiguration {

    public static void main(String[] args) {
    SpringApplication app = new SpringApplication(Application.class);
    app.run(args);
}
}

Ran ng build --base-href . создает файлы, как показано на рисунке ниже.

index.html:

<!doctype html>
<html lang="en">
<head>
  <meta charset="utf-8">
  <title>Welcome app</title>
  <base href="/">

  <meta name="viewport" content="width=device-width, initial-scale=1">
  <link rel="icon" type="image/x-icon" href="favicon.ico">
</head>
<body>
  <app-root></app-root>
<script type="text/javascript" src="runtime.js"></script><script type="text/javascript" src="polyfills.js"></script><script type="text/javascript" src="styles.js"></script><script type="text/javascript" src="vendor.js"></script><script type="text/javascript" src="main.js"></script></body>
</html>

Примечание. Это простой проект. Код переднего конца находится по адресу: src / main / java / webapp / frontend dir

Application.yml в / resources

server:
  servlet:
    context-path: /
  port: 8080

На старте кота:

Mapped URL path [/webjars/**] onto handler of type [class org.springframework.web.servlet.resource.ResourceHttpRequestHandler]
2018-09-13 12:45:34.372  INFO 96027 --- [           main] o.s.w.s.handler.SimpleUrlHandlerMapping  : Mapped URL path [/**] onto handler of type [class org.springframework.web.servlet.resource.ResourceHttpRequestHandler]
2018-09-13 12:45:34.384  INFO 96027 --- [           main] .m.m.a.ExceptionHandlerExceptionResolver : Detected @ExceptionHandler methods in exceptionHandle
2018-09-13 12:45:34.405  INFO 96027 --- [           main] o.s.b.a.w.s.WelcomePageHandlerMapping    : Adding welcome page: class path resource [static/index.html]
2018-09-13 12:45:34.566  INFO 96027 --- [           main] o.s.j.e.a.AnnotationMBeanExporter        : Registering beans for JMX exposure on startup
2018-09-13 12:45:34.568  INFO 96027 --- [           main] o.s.j.e.a.AnnotationMBeanExporter        : Bean with name 'dataSource' has been autodetected for JMX exposure
2018-09-13 12:45:34.575  INFO 96027 --- [           main] o.s.j.e.a.AnnotationMBeanExporter        : Located MBean 'dataSource': registering with JMX server as MBean [com.zaxxer.hikari:name=dataSource,type=HikariDataSource]
2018-09-13 12:45:34.620  INFO 96027 --- [           main] o.s.b.w.embedded.tomcat.TomcatWebServer  : Tomcat started on port(s): 8080 (http) with context path ''

Я даже пытался добавить html-файл в / resources, чтобы посмотреть, обслуживает ли tomcat какое-либо содержимое из этой папки. Я также не могу получить доступ к page1.html, так что не уверен, чем будет отличаться контент angular / ng от того, который он не сможет обслуживать, когда tomcat запущен и работает.

ресурсы / статический

Нужна ли какая-либо другая конфигурация, чтобы иметь код углового внешнего интерфейса с пружинной загрузкой? Любое предложение приветствуется.

@ DavidT Ответы на ваши вопросы:

  • Да, в build.gradle: compile('org.springframework.boot:spring-boot-starter-web:2.0.2.RELEASE')

  • статический контент здесь: MyProject / MyProject-Web / SRC / главная / ресурсы / статический /

  • Поскольку подпружиненный загрузчик не выбирает угловое статическое содержимое из пути, я ссылаются на онлайн-ресурсы, которые предлагают добавить контроллер специально, чтобы служить ему. [У меня есть 3 нг компонентов логин : http://localhost:4200/,home: http://localhost:4200/home,sale: http://localhost:4200/sale. Но чтобы получить доступ к порту Tomcat, я думал, чтобы положить файлы под статические; остальное угловые позаботятся о маршрутизации.]

  • При запуске ng build из frotnend dir генерирует угловые файлы в frontend / src dir. Либо я могу вручную скопировать, вставить вручную, чтобы поместить в статическую папку, либо изменить outputPath, чтобы он указывал на ресурсы / статические в angular.json, которые непосредственно помещают его туда при запуске ng build cmd. точная файлы на вышеуказанных ресурсах / статический скриншот.

  • Я не использовал консоль javascript, но открыл index.html в браузере вариант от IntellijIdea, проверить на веб-странице я вижу ошибку-

Отказался от выполнения скрипта из '', потому что его MIME-тип ('text / html') не является исполняемым, и строгая проверка типов MIME включен.

Замена <script type to "text/html" удаляет эти ошибки из проверки, но пользовательский интерфейс по-прежнему отсутствует http://localhost:8080/.

Странная часть, когда я вставил тот же файл index.html из этого демонстрационного проекта в мой в статической папке, он ничего не отображает при просмотре http://localhost:8080. Но заметил, когда открывал этот файл из браузера в IntellijIdea (этот URI в браузере: http://localhost:63342/MY-PROJ/MY-PROJ-WEB-main/static/index.html, затем он показывает содержимое

Является ли <base href="/"> проблемой или тегами сценариев?

Ответы [ 3 ]

0 голосов
/ 14 сентября 2018

Шаги к успеху без сложностей, как в ссылке выше:

  1. Пошел на https://start.spring.io/
  2. Выбранный проект Gradle
  3. Добавлена ​​веб-зависимость
  4. Скачал и разархивировал результат (не изменил имя с demo)
  5. Создать: demo / src / main / resources / static / index.html со следующим содержимым:
    <html><body>YOU ARE IN!</body></html>
  6. Введите следующую команду в каталоге demo для запуска приложения: ./gradlew bootRun
  7. Откройте браузер и перейдите на http://localhost:8080/

Теперь у вас есть доказательство того, что помещение чего-либо в MY PROJECT/src/main/resources/static/ приведет к созданию содержимого вашего HTML-файла.

Итак, у меня есть следующие вопросы:

  • Вы добавили SpringMVC в свой проект весенней загрузки, используя что-то вроде compile('org.springframework.boot:spring-boot-starter-web')?

  • Вы поместили свой статический контент в МОЙ ПРОЕКТ / src / main / resources / static /?

  • Зачем вам нужен контроллер для обслуживания статического контента, если он вам предоставляется? Особенно тот, который сопоставлен с /?
  • Угловое размещение файлов *. Html в MY PROJECT/src/main/resources/static/?
  • Что говорит консоль javascript? runtime.js найден?

См. https://spring.io/guides/gs/serving-web-content/ в разделе Добавить домашнюю страницу

Пожалуйста, смотрите https://stackoverflow.com/questions/24661289/spring-boot-not-serving-static-content контент для других идей о том, что не следует делать (и почему).

Это было первоначально отправлено на https://www.quora.com/How-can-spring-boot-serve-angular-static-files/answer/David-Talalayevsky

0 голосов
/ 15 сентября 2018

В методе Controller попробуйте поместить аннотацию @RequestMapping просто как предложение

Как это:

@Controller
@RequestMapping("/")
public class AppController{ 
 }

И на ComponentScan (basepackages {"com.packagename модальных классов"})

0 голосов
/ 07 сентября 2018

Это потому, что вы используете аннотацию @RestController, которая неявно включает в себя @ResponseBody.Вы должны использовать @Controller для загрузки Spring, чтобы автоматически загружать HTML-шаблон.

@Controller
public class AppController {
    @GetMapping("/")
    public String index() {
        return "index";
    }
 }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...