У меня есть бэкэнд 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 ошибкам:
Я добавил 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
, который должен был быть http://localhost:8090/dig/api/hospital?offset=0&limit=10
Я бы очень признателен любому совет как решить эту проблему. Или любые выводы также приветствуются.