Spring Boot API 和 React JS 在 Tomcat 上运行

huangapple go评论93阅读模式
英文:

Spring boot API and React js running on Tomcat

问题

我正在开发一个React JS应用程序,该应用程序从我的Spring Boot API获取所有数据。

在本地一切都运行良好(Spring Boot API在端口4000上,React JS在端口3000上,代理值为“http://localhost/4000”)。

我成功创建了一个war文件,其中包含了我的React JS应用程序和Spring Boot API(在端口8080上运行)。

我将war文件部署到了本地的Tomcat服务器上,并且状态显示为“ok”。

API调用非常成功(例如http://localhost:8080/webfolder/api/categories)。

但是我的React应用程序无法正确地进行API调用(http://localhost:8080/api/categories),正确的URL应该是http://localhost:8080/webfolder/api/categories,如下图所示:

Spring Boot API 和 React JS 在 Tomcat 上运行

这是我的pom.xml文件的样子:

<groupId>com.fox</groupId>
<artifactId>events-platform</artifactId>
<version>0.0.1-SNAPSHOT</version>
<packaging>war</packaging>

<!-- 其他内容省略 -->

这是我的package.json文件的开头部分:

{
  "name": "events-platform",
  "version": "0.1.0",
  "private": true,
  
  // 其他内容省略
}

前端中的API调用示例:

axios.get('/webfolder/api/categories')
  .then(response => {
    // 处理响应数据
  })
  .catch(error => {
    // 处理错误
  });
英文:

I'm developing a React JS application that fetches all data from my Spring boot API.

Everything works well locally.(Spring boot API on PORT 4000 and React JS on PORT 3000 with a proxy of value "http://localhost/4000")

I managed to create a war file that includes both my React js app and Spring boot API.(Running on PORT 8080)

I deployed the war file on a local tomcat server with an "ok" status.

Api calls works very well (http://localhost:8080/webfolder/api/categories for instance)

but my React App fails to make api calls correctly (http://localhost:8080/api/categories which it should be http://localhost:8080/webfolder/api/categories) as you can see in the following image:

Spring Boot API 和 React JS 在 Tomcat 上运行

this is how my pom.xml look like :

&lt;groupId&gt;com.fox&lt;/groupId&gt;
&lt;artifactId&gt;events-platform&lt;/artifactId&gt;
&lt;version&gt;0.0.1-SNAPSHOT&lt;/version&gt;
&lt;packaging&gt;war&lt;/packaging&gt;
&lt;name&gt;events-platform&lt;/name&gt;
&lt;description&gt;Events-platform built using React JS and Spring boot&lt;/description&gt;
&lt;parent&gt;
&lt;groupId&gt;org.springframework.boot&lt;/groupId&gt;
&lt;artifactId&gt;spring-boot-starter-parent&lt;/artifactId&gt;
&lt;version&gt;2.3.0.RELEASE&lt;/version&gt;
&lt;relativePath/&gt; &lt;!-- lookup parent from repository --&gt;
&lt;/parent&gt;
&lt;properties&gt;
&lt;project.build.sourceEncoding&gt;UTF-8&lt;/project.build.sourceEncoding&gt;
&lt;project.reporting.outputEncoding&gt;UTF-8&lt;/project.reporting.outputEncoding&gt;
&lt;java.version&gt;1.8&lt;/java.version&gt;
&lt;/properties&gt;
&lt;dependencies&gt;
&lt;dependency&gt;
&lt;groupId&gt;org.springframework.boot&lt;/groupId&gt;
&lt;artifactId&gt;spring-boot-starter-data-jpa&lt;/artifactId&gt;
&lt;version&gt;2.3.0.RELEASE&lt;/version&gt;
&lt;/dependency&gt;
&lt;dependency&gt;
&lt;groupId&gt;org.springframework.boot&lt;/groupId&gt;
&lt;artifactId&gt;spring-boot-starter-tomcat&lt;/artifactId&gt;
&lt;scope&gt;provided&lt;/scope&gt;
&lt;/dependency&gt;
&lt;dependency&gt;
&lt;groupId&gt;org.springframework.boot&lt;/groupId&gt;
&lt;artifactId&gt;spring-boot-starter-data-rest&lt;/artifactId&gt;
&lt;/dependency&gt;
&lt;dependency&gt;
&lt;groupId&gt;org.springframework.boot&lt;/groupId&gt;
&lt;artifactId&gt;spring-boot-starter-mail&lt;/artifactId&gt;
&lt;version&gt;2.3.4.RELEASE&lt;/version&gt;
&lt;/dependency&gt;
&lt;dependency&gt;
&lt;groupId&gt;org.springframework.boot&lt;/groupId&gt;
&lt;artifactId&gt;spring-boot-starter-security&lt;/artifactId&gt;
&lt;/dependency&gt;
&lt;dependency&gt;
&lt;groupId&gt;org.springframework.boot&lt;/groupId&gt;
&lt;artifactId&gt;spring-boot-starter-web&lt;/artifactId&gt;
&lt;/dependency&gt;
&lt;dependency&gt;
&lt;groupId&gt;org.springframework.boot&lt;/groupId&gt;
&lt;artifactId&gt;spring-boot-devtools&lt;/artifactId&gt;
&lt;scope&gt;runtime&lt;/scope&gt;
&lt;optional&gt;true&lt;/optional&gt;
&lt;/dependency&gt;
&lt;dependency&gt;
&lt;groupId&gt;org.postgresql&lt;/groupId&gt;
&lt;artifactId&gt;postgresql&lt;/artifactId&gt;
&lt;scope&gt;runtime&lt;/scope&gt;
&lt;/dependency&gt;
&lt;dependency&gt;
&lt;groupId&gt;io.jsonwebtoken&lt;/groupId&gt;
&lt;artifactId&gt;jjwt&lt;/artifactId&gt;
&lt;version&gt;0.9.0&lt;/version&gt;
&lt;/dependency&gt;
&lt;dependency&gt;
&lt;groupId&gt;org.projectlombok&lt;/groupId&gt;
&lt;artifactId&gt;lombok&lt;/artifactId&gt;
&lt;optional&gt;true&lt;/optional&gt;
&lt;/dependency&gt;
&lt;dependency&gt;
&lt;groupId&gt;org.springframework.boot&lt;/groupId&gt;
&lt;artifactId&gt;spring-boot-starter-test&lt;/artifactId&gt;
&lt;scope&gt;test&lt;/scope&gt;
&lt;exclusions&gt;
&lt;exclusion&gt;
&lt;groupId&gt;org.junit.vintage&lt;/groupId&gt;
&lt;artifactId&gt;junit-vintage-engine&lt;/artifactId&gt;
&lt;/exclusion&gt;
&lt;/exclusions&gt;
&lt;/dependency&gt;
&lt;dependency&gt;
&lt;groupId&gt;org.springframework&lt;/groupId&gt;
&lt;artifactId&gt;spring-webmvc&lt;/artifactId&gt;
&lt;version&gt;5.2.8.RELEASE&lt;/version&gt;
&lt;/dependency&gt;
&lt;dependency&gt;
&lt;groupId&gt;com.google.code.gson&lt;/groupId&gt;
&lt;artifactId&gt;gson&lt;/artifactId&gt;
&lt;version&gt;2.8.5&lt;/version&gt;&lt;!--$NO-MVN-MAN-VER$--&gt;
&lt;/dependency&gt;
&lt;dependency&gt;
&lt;groupId&gt;javax&lt;/groupId&gt;
&lt;artifactId&gt;javaee-web-api&lt;/artifactId&gt;
&lt;version&gt;7.0&lt;/version&gt;
&lt;/dependency&gt;
&lt;dependency&gt;
&lt;groupId&gt;jakarta.validation&lt;/groupId&gt;
&lt;artifactId&gt;jakarta.validation-api&lt;/artifactId&gt;
&lt;version&gt;2.0.2&lt;/version&gt;
&lt;/dependency&gt;
&lt;dependency&gt;
&lt;groupId&gt;junit&lt;/groupId&gt;
&lt;artifactId&gt;junit&lt;/artifactId&gt;
&lt;scope&gt;test&lt;/scope&gt;
&lt;/dependency&gt;
&lt;dependency&gt;
&lt;groupId&gt;org.hibernate&lt;/groupId&gt;
&lt;artifactId&gt;hibernate-agroal&lt;/artifactId&gt;
&lt;version&gt;5.4.21.Final&lt;/version&gt;
&lt;type&gt;pom&lt;/type&gt;
&lt;/dependency&gt;
&lt;dependency&gt;
&lt;groupId&gt;org.apache.maven.plugins&lt;/groupId&gt;
&lt;artifactId&gt;maven-antrun-plugin&lt;/artifactId&gt;
&lt;version&gt;3.0.0&lt;/version&gt;
&lt;type&gt;maven-plugin&lt;/type&gt;
&lt;/dependency&gt;
&lt;/dependencies&gt;
&lt;build&gt;
&lt;plugins&gt;
&lt;plugin&gt;
&lt;groupId&gt;org.springframework.boot&lt;/groupId&gt;
&lt;artifactId&gt;spring-boot-maven-plugin&lt;/artifactId&gt;
&lt;/plugin&gt;
&lt;plugin&gt;
&lt;groupId&gt;com.github.eirslett&lt;/groupId&gt;
&lt;artifactId&gt;frontend-maven-plugin&lt;/artifactId&gt;
&lt;version&gt;1.6&lt;/version&gt;
&lt;configuration&gt;
&lt;workingDirectory&gt;${project.basedir}/src/main/webapp/front-end&lt;/workingDirectory&gt;
&lt;installDirectory&gt;target&lt;/installDirectory&gt;
&lt;/configuration&gt;
&lt;executions&gt;
&lt;execution&gt;
&lt;id&gt;install node and npm&lt;/id&gt;
&lt;goals&gt;
&lt;goal&gt;install-node-and-npm&lt;/goal&gt;
&lt;/goals&gt;
&lt;configuration&gt;
&lt;nodeVersion&gt;v14.5.0&lt;/nodeVersion&gt;
&lt;npmVersion&gt;6.14.5&lt;/npmVersion&gt;
&lt;/configuration&gt;
&lt;/execution&gt;
&lt;execution&gt;
&lt;id&gt;npm install&lt;/id&gt;
&lt;goals&gt;
&lt;goal&gt;npm&lt;/goal&gt;
&lt;/goals&gt;
&lt;configuration&gt;
&lt;arguments&gt;install&lt;/arguments&gt;
&lt;/configuration&gt;
&lt;/execution&gt;
&lt;execution&gt;
&lt;id&gt;npm run build&lt;/id&gt;
&lt;goals&gt;
&lt;goal&gt;npm&lt;/goal&gt;
&lt;/goals&gt;
&lt;configuration&gt;
&lt;arguments&gt;run build&lt;/arguments&gt;
&lt;/configuration&gt;
&lt;/execution&gt;
&lt;/executions&gt;
&lt;/plugin&gt;
&lt;plugin&gt;
&lt;artifactId&gt;maven-antrun-plugin&lt;/artifactId&gt;
&lt;executions&gt;
&lt;execution&gt;
&lt;phase&gt;generate-resources&lt;/phase&gt;
&lt;configuration&gt;
&lt;target&gt;
&lt;copy todir=&quot;${project.build.directory}/classes/public&quot;&gt;
&lt;fileset dir=&quot;${project.basedir}/src/main/webapp/front-end/build&quot;/&gt;
&lt;/copy&gt;
&lt;/target&gt;
&lt;/configuration&gt;
&lt;goals&gt;
&lt;goal&gt;run&lt;/goal&gt;
&lt;/goals&gt;
&lt;/execution&gt;
&lt;/executions&gt;
&lt;/plugin&gt;
&lt;/plugins&gt;
&lt;/build&gt;

And this is how the beginning of my package.json look like :

Spring Boot API 和 React JS 在 Tomcat 上运行

Instance of my API calls in the front-end :

Spring Boot API 和 React JS 在 Tomcat 上运行

答案1

得分: 0

根据您在测试中展示的内容,您的 API 正在使用 /webfolder 上下文,而您的 ReactJS 客户端则使用根上下文 /

您可以将客户端更改为使用 /webfolder 上下文,或者配置您的 API 使用根上下文 /

更新 2020-10-08 - 12:20

在您更新了 Web 客户端的示例代码之后,我建议您将 axios 的调用更改为类似以下的形式:

const API_ROOT = '/webfolder/api';

useEffect(() => {
  axios.get(`${API_ROOT}/spaces`).then(...).catch(...)
  axios.get(`${API_ROOT}/categories`).then(...).catch(...)
})
英文:

From what you've shown in your tests, your API is using the /webfolder context, while your ReactJS client is using the root context /.

You could change our client to use the /webfolder context, or configure your API to use the root context /.

UPDATE 2020-10-08 - 12:20

After your update with your web client's sample code, I'd suggest you change your axios calls to something like:

const API_ROOT = &#39;/webfolder/api&#39;

useEffect(() =&gt; {
  axios.get(`${API_ROOT}/spaces`).then(...).catch(...)
  axios.get(`${API_ROOT}/categories`).then(...).catch(...)
})

huangapple
  • 本文由 发表于 2020年10月7日 04:26:14
  • 转载请务必保留本文链接:https://go.coder-hub.com/64233338.html
匿名

发表评论

匿名网友

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

确定