Развертывание Spring Boot с Angular 9 в качестве WAR в Apache Tomcat - PullRequest
0 голосов
/ 23 апреля 2020

У меня есть бэкэнд Spring Boot и приложение Angular.

Теперь я хотел бы создать развертываемый файл войны и развернуть приложение в Tomcat, поэтому я применил плагин войны и объявил следующее в build.gradle (spring-boot-starter-tomcat).

Теперь сборка успешно генерирует файл войны, и Tomcat может развернуть и запустить его без каких-либо ошибок. После развертывания Backend работает отлично

 http://localhost:8090/dig/api/hospital?offset=0&limit=10 --> works fine(Spring Boot Endpoint)

Проблема в том, что когда я на самом деле открываю приложение, оно, по-видимому, пытается извлечь ресурсы Angular из неправильного расположения, что приводит к 404 ошибкам: enter image description here

Я добавил server.servlet.context-path = /dig, но это не имеет никакого эффекта (я думаю, это повлияет только на встроенный контейнер). Когда я пытаюсь вызвать

  • localhost: 8080 / dig / index. html
  • localhost: 8080 / index. html

it показывает 404. Веб-сервисы работают правильно. Я могу их вызвать.

Как мне позвонить по индексу. html моего приложения? Я добавил класс ServletInitializer, который расширяет SpringBootServletInitializer следующим образом

public class ServletInitializer extends SpringBootServletInitializer {

    @Override
    protected SpringApplicationBuilder configure(SpringApplicationBuilder application) {
        return application.sources(DigigoServerApplication.class);
    }

    @Override
    public void onStartup(ServletContext container) {
        XmlWebApplicationContext appContext = new XmlWebApplicationContext();
        appContext.setConfigLocation("/WEB-INF/spring/dispatcher-config.xml");

        ServletRegistration.Dynamic dispatcher = container.addServlet("dispatcher", new DispatcherServlet(appContext));
        dispatcher.setLoadOnStartup(1);
        dispatcher.addMapping("/*");
    }

}

, а мой build.gradle ниже

buildscript {
    ext {
        springBootVersion = "2.1.7.RELEASE"
    }
    repositories {
        mavenCentral()
    }

}
ext.clientAppDir="$projectDir/../dig-client"
ext.serverAppDir="$projectDir/../dig-server"
ext.springBootMainClass="com.sab.dig.DigServerApplication"

  configurations {
    developmentOnly
    runtimeClasspath {
        extendsFrom developmentOnly
    }
}

repositories {
    mavenCentral()
}


task buildClient(type:Exec) {
    dependsOn "installClient"
    workingDir "$clientAppDir"
    inputs.dir "$clientAppDir"
    group = BasePlugin.BUILD_GROUP

    if (System.getProperty("os.name").toUpperCase().contains("WINDOWS")){
        commandLine "ng.cmd", "build"
    } else {
        commandLine "ng", "build"
    }
}

task installClient(type:Exec) {
    workingDir "$clientAppDir"
    inputs.dir "$clientAppDir"
    group = BasePlugin.BUILD_GROUP

    if (System.getProperty("os.name").toUpperCase().contains("WINDOWS")){
        commandLine "npm.cmd", "install"
    } else {
        commandLine "npm", "install"
    }
}

task copyClientFiles(dependsOn:buildClient) {
    copy {
        from "${clientAppDir}/dist"
        into "${serverAppDir}/src/main/resources/static"
    }
}

processResources {
    dependsOn "copyClientFiles"
}

bootWar {
    classifier = 'boot'
    mainClassName = springBootMainClass
}

bootRun {
    classpath = sourceSets.main.runtimeClasspath 
    main = springBootMainClass
}

Редактировать: после добавления кода ниже внутри мое Angular приложение, я добавил proxy.conf.json файл root:

{
"/api": {
    "target": "http://localhost:8080/dig",
    "secure": false
    }
}

мой index.html я изменил базовый href на './'.

<base href="./">

Я устанавливаю все URL-адреса в api-config.ts, как показано ниже для вызова внутри сервиса.

export const APP_URL = "/api/";
export const GET_HOSPITALS =  'hospital';

и для вызова в сервисе вот так

export class UploadsService {
constructor(private httpClient: HttpClient) { }
getAllHospitals() {
        return this.httpClient.get(APP_URL + GET_HOSPITALS, { params : {offset: "0", limit: "10"} });
    }
}

Теперь я могу просматривать пользовательский интерфейс в http://localhost:8090/dig/, который выводит меня на страницу входа (начальную страницу), как и ожидалось.

Но после вышеуказанных изменений API не работает как URL меняли на http://localhost:8090/api/hospital?offset=0&limit=10

enter image description here

, который должен был быть http://localhost:8090/dig/api/hospital?offset=0&limit=10

Я бы очень признателен любому совет как решить эту проблему. Или любые выводы также приветствуются.

...