Spring Boot不能正常工作,出现了一些错误?

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

Spring Boot not working getting some errors?

问题

以下是您提供的内容的翻译:

请帮助我,因为我无法找出我的Spring Boot应用程序中出现了什么问题。我正在使用以下的pom.xml文件:

  1. <parent>
  2. <groupId>org.springframework.boot</groupId>
  3. <artifactId>spring-boot-starter-parent</artifactId>
  4. <version>2.2.5.RELEASE</version>
  5. <relativePath/>
  6. </parent>
  7. <properties>
  8. <java.version>1.8</java.version>
  9. <spring-boot-starter.version>2.22.0</spring-boot-starter.version>
  10. <tomcat.version>9.0.37</tomcat.version>
  11. </properties>
  12. <dependencies>
  13. <dependency>
  14. <groupId>javax.servlet</groupId>
  15. <artifactId>javax.servlet-api</artifactId>
  16. <version>3.1.0</version>
  17. <scope>provided</scope>
  18. </dependency>
  19. <dependency>
  20. <groupId>org.springframework.boot</groupId>
  21. <artifactId>spring-boot-starter-data-rest</artifactId>
  22. </dependency>
  23. <dependency>
  24. <groupId>org.springframework.boot</groupId>
  25. <artifactId>spring-boot-starter-web</artifactId>
  26. </dependency>
  27. <dependency>
  28. <groupId>org.apache.tomcat.embed</groupId>
  29. <artifactId>tomcat-embed-jasper</artifactId>
  30. <scope>provided</scope>
  31. </dependency>
  32. <dependency>
  33. <groupId>org.springframework.boot</groupId>
  34. <artifactId>spring-boot-devtools</artifactId>
  35. <scope>runtime</scope>
  36. </dependency>
  37. <dependency>
  38. <groupId>org.springframework</groupId>
  39. <artifactId>spring-context-support</artifactId>
  40. <version>5.2.2.RELEASE</version>
  41. </dependency>
  42. </dependencies>

当我使用Tomcat 9时,会出现以下错误:

  1. java.lang.NoSuchMethodError: javax.servlet.http.HttpServletRequest.getHttpServletMapping()Ljavax/servlet/http/HttpServletMapping;
  2. org.springframework.web.servlet.view.InternalResourceView.renderMergedOutputModel(InternalResourceView.java:171)
  3. ...

而当我使用Tomcat 8时:

  1. <tomcat.version>8.5.50</tomcat.version>

会出现以下错误:

描述:

尝试调用一个不存在的方法。尝试调用的位置为:

org.springframework.boot.web.embedded.tomcat.TomcatServletWebServerFactory.getWebServer(TomcatServletWebServerFactory.java:175)

以下方法不存在:

org.apache.tomcat.util.modeler.Registry.disableRegistry()V

该方法的类,org.apache.tomcat.util.modeler.Registry,可以从以下位置访问:

jar:file:/tomcat/embed/tomcat-embed-core/8.5.50/tomcat-embed-core-8.5.50.jar!/org/apache/tomcat/util/modeler/Registry.class

它是从以下位置加载的:

file:/tomcat/embed/tomcat-embed-core/8.5.50/tomcat-embed-core-8.5.50.jar

请更正应用程序的类路径,以便它包含一个与org.apache.tomcat.util.modeler.Registry兼容的单个版本。

如果有人知道如何解决,请帮助一下。

英文:

Please help me as I am not able to find out what is the issue in my springboot application. I am using following pom.xml

  1. &lt;parent&gt;
  2. &lt;groupId&gt;org.springframework.boot&lt;/groupId&gt;
  3. &lt;artifactId&gt;spring-boot-starter-parent&lt;/artifactId&gt;
  4. &lt;version&gt;2.2.5.RELEASE&lt;/version&gt;
  5. &lt;relativePath/&gt;
  6. &lt;/parent&gt;
  7. &lt;properties&gt;
  8. &lt;java.version&gt;1.8&lt;/java.version&gt;
  9. &lt;spring-boot-starter.version&gt;2.22.0&lt;/spring-boot-starter.version&gt;
  10. &lt;tomcat.version&gt;9.0.37&lt;/tomcat.version&gt;
  11. &lt;/properties&gt;
  12. &lt;dependencies&gt;
  13. &lt;dependency&gt;
  14. &lt;groupId&gt;javax.servlet&lt;/groupId&gt;
  15. &lt;artifactId&gt;javax.servlet-api&lt;/artifactId&gt;
  16. &lt;version&gt;3.1.0&lt;/version&gt;
  17. &lt;scope&gt;provided&lt;/scope&gt;
  18. &lt;/dependency&gt;
  19. &lt;dependency&gt;
  20. &lt;groupId&gt;org.springframework.boot&lt;/groupId&gt;
  21. &lt;artifactId&gt;spring-boot-starter-data-rest&lt;/artifactId&gt;
  22. &lt;/dependency&gt;
  23. &lt;dependency&gt;
  24. &lt;groupId&gt;org.springframework.boot&lt;/groupId&gt;
  25. &lt;artifactId&gt;spring-boot-starter-web&lt;/artifactId&gt;
  26. &lt;/dependency&gt;
  27. &lt;dependency&gt;
  28. &lt;groupId&gt;org.apache.tomcat.embed&lt;/groupId&gt;
  29. &lt;artifactId&gt;tomcat-embed-jasper&lt;/artifactId&gt;
  30. &lt;scope&gt;provided&lt;/scope&gt;
  31. &lt;/dependency&gt;
  32. &lt;dependency&gt;
  33. &lt;groupId&gt;org.springframework.boot&lt;/groupId&gt;
  34. &lt;artifactId&gt;spring-boot-devtools&lt;/artifactId&gt;
  35. &lt;scope&gt;runtime&lt;/scope&gt;
  36. &lt;/dependency&gt;
  37. &lt;dependency&gt;
  38. &lt;groupId&gt;org.springframework&lt;/groupId&gt;
  39. &lt;artifactId&gt;spring-context-support&lt;/artifactId&gt;
  40. &lt;version&gt;5.2.2.RELEASE&lt;/version&gt;
  41. &lt;/dependency&gt;
  42. &lt;/dependencies&gt;

When I am using tomcat 9 it gives me below error:

  1. java.lang.NoSuchMethodError: javax.servlet.http.HttpServletRequest.getHttpServletMapping()Ljavax/servlet/http/HttpServletMapping;
  2. org.springframework.web.servlet.view.InternalResourceView.renderMergedOutputModel(InternalResourceView.java:171)
  3. org.springframework.web.servlet.view.AbstractView.render(AbstractView.java:316)
  4. org.springframework.web.servlet.DispatcherServlet.render(DispatcherServlet.java:1373)
  5. org.springframework.web.servlet.DispatcherServlet.processDispatchResult(DispatcherServlet.java:1118)
  6. org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:1057)
  7. org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:943)
  8. org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:1006)
  9. org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:898)
  10. javax.servlet.http.HttpServlet.service(HttpServlet.java:687)
  11. org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:883)
  12. javax.servlet.http.HttpServlet.service(HttpServlet.java:790)
  13. org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:53)
  14. com.b.AuthenticationFilter.doFilter(AuthenticationFilter.java:665)
  15. org.springframework.web.filter.RequestContextFilter.doFilterInternal(RequestContextFilter.java:100)
  16. org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119)
  17. org.springframework.web.filter.FormContentFilter.doFilterInternal(FormContentFilter.java:93)
  18. org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119)
  19. org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:201)
  20. org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119)

And when I am using tomcat 8 :

  1. &lt;tomcat.version&gt;8.5.50&lt;/tomcat.version&gt;

it gives me below error:

Description:

An attempt was made to call a method that does not exist. The attempt was
made from the following location:

  1. org.springframework.boot.web.embedded.tomcat.TomcatServletWebServerFactory.getWebServer(TomcatServletWebServerFactory.java:175)
  2. The following method did not exist:
  3. org.apache.tomcat.util.modeler.Registry.disableRegistry()V
  4. The method&#39;s class, org.apache.tomcat.util.modeler.Registry, is available from the following locations:
  5. jar:file:/tomcat/embed/tomcat-embed-core/8.5.50/tomcat-embed-core-8.5.50.jar!/org/apache/tomcat/util/modeler/Registry.class

It was loaded from the following location:

  1. file:/tomcat/embed/tomcat-embed-core/8.5.50/tomcat-embed-core-8.5.50.jar
  2. Correct the classpath of your application so that it contains a single, compatible version of org.apache.tomcat.util.modeler.Registry

If anyone can knows how to solve it please help.

答案1

得分: 4

你的POM文件中包含一些依赖项,这些依赖项之间存在版本冲突。

  1. <dependency>
  2. <groupId>org.springframework.boot</groupId>
  3. <artifactId>spring-boot-starter-web</artifactId>
  4. </dependency>

spring-boot-starter-web 的版本 2.3.3.RELEASE 已经内置了 Tomcat 9.0.37

Tomcat 9 及以上版本使用 servlet 4.x。

从你的 pom.xml 中移除以下依赖项可以解决依赖问题。

  1. <dependency>
  2. <groupId>org.apache.tomcat.embed</groupId>
  3. <artifactId>tomcat-embed-jasper</artifactId>
  4. <scope>provided</scope>
  5. </dependency>

  1. <dependency>
  2. <groupId>javax.servlet</groupId>
  3. <artifactId>javax.servlet-api</artifactId>
  4. <version>3.1.0</version>
  5. <scope>provided</scope>
  6. </dependency>

因为这些是传递性依赖项,已经被你项目中的其他依赖项提供。

你可以使用 mvn dependency:tree -Dverbose 命令来检查依赖树,以观察潜在的依赖冲突。

英文:

Your POM contains some dependencies that has version conflicts with each other.

  1. &lt;dependency&gt;
  2. &lt;groupId&gt;org.springframework.boot&lt;/groupId&gt;
  3. &lt;artifactId&gt;spring-boot-starter-web&lt;/artifactId&gt;
  4. &lt;/dependency&gt;

The 2.3.3.RELEASE version of spring-boot-starter-web is already built with Tomcat 9.0.37

Tomcat 9 and above is on servlet 4.x

Removing these the following dependencies from your pom.xml should alleviate your dependency problems.

  1. &lt;dependency&gt;
  2. &lt;groupId&gt;org.apache.tomcat.embed&lt;/groupId&gt;
  3. &lt;artifactId&gt;tomcat-embed-jasper&lt;/artifactId&gt;
  4. &lt;scope&gt;provided&lt;/scope&gt;
  5. &lt;/dependency&gt;

and

  1. &lt;dependency&gt;
  2. &lt;groupId&gt;javax.servlet&lt;/groupId&gt;
  3. &lt;artifactId&gt;javax.servlet-api&lt;/artifactId&gt;
  4. &lt;version&gt;3.1.0&lt;/version&gt;
  5. &lt;scope&gt;provided&lt;/scope&gt;
  6. &lt;/dependency&gt;

since these are transitive dependencies that are already provided by dependencies in your project.

You can use mvn dependency:tree -Dverbose to inspect your dependency tree and observe any potential dependency conficts.

答案2

得分: 1

  1. 我曾经遇到过类似的问题,原因是 jsp-api 与相应的 servlet-api 版本不匹配。正如 Sven Döring 已经提到的,Spring Boot 2.1.x 使用的是 Tomcat 9,该版本使用/提供 Servlet API v4。因此,您需要 jsp-api 2.3.3,否则可能会出现 NoSuchMethodError
  2. <dependency>
  3. <groupId>javax.servlet.jsp</groupId>
  4. <artifactId>javax.servlet.jsp-api</artifactId>
  5. <version>2.3.3</version>
  6. <scope>provided</scope>
  7. </dependency>
  8. 有关版本匹配的更多信息可以在这里找到:
  9. [![enter image description here][1]][1]
  10. 不幸的是,Tomcat 9 Servlet-API 4 在此列表中找不到。
  11. [1]: https://i.stack.imgur.com/SKmRW.png
英文:

I had a similar problem and the cause was the jsp-api didn't fit to the corresponding servlet-api version. As Sven Döring already mentioned Spring Boot 2.1.x uses Tomcat 9 which uses/provides Servlet API v4. For this you need jsp-api 2.3.3 otherwise you can get the NoSuchMethodError.

  1. &lt;dependency&gt;
  2. &lt;groupId&gt;javax.servlet.jsp&lt;/groupId&gt;
  3. &lt;artifactId&gt;javax.servlet.jsp-api&lt;/artifactId&gt;
  4. &lt;version&gt;2.3.3&lt;/version&gt;
  5. &lt;scope&gt;provided&lt;/scope&gt;
  6. &lt;/dependency&gt;

More info about the version matching can be found here:
Spring Boot不能正常工作,出现了一些错误?
Unfortunately Tomcat 9 and Servlet-API 4 is missing in this list.

答案3

得分: 1

缺失的方法 HttpServletRequest.getHttpServletMapping() 是在 Servlet API 版本 4 中添加的,因此问题是由于您依赖于 Servlet 3.1 API 引起的:

  1. <dependency>
  2. <groupId>javax.servlet</groupId>
  3. <artifactId>javax.servlet-api</artifactId>
  4. <version>3.1.0</version>
  5. <scope>provided</scope>
  6. </dependency>

不应该需要声明对 Servlet API 的依赖,因为它已经包含在 spring-boot-starter-web 中。从您的 pom.xml 中移除上述依赖应该可以解决您的问题。

英文:

The method that is missing, HttpServletRequest.getHttpServletMapping(), was added to the Servlet API in version 4 so the problem is caused by your dependency on the Servlet 3.1 API:

  1. &lt;dependency&gt;
  2. &lt;groupId&gt;javax.servlet&lt;/groupId&gt;
  3. &lt;artifactId&gt;javax.servlet-api&lt;/artifactId&gt;
  4. &lt;version&gt;3.1.0&lt;/version&gt;
  5. &lt;scope&gt;provided&lt;/scope&gt;
  6. &lt;/dependency&gt;

There should be no need to declare a dependency on the Servlet API as it is already included with spring-boot-starter-web. Removing the above from your pom.xml should fix your problem.

huangapple
  • 本文由 发表于 2020年9月2日 20:51:15
  • 转载请务必保留本文链接:https://go.coder-hub.com/63705919.html
匿名

发表评论

匿名网友

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

确定