Apache Tomcat-javax.servlet.ServletException:我的类不是 Servlet

Posted

技术标签:

【中文标题】Apache Tomcat-javax.servlet.ServletException:我的类不是 Servlet【英文标题】:Apache Tomcat-javax.servlet.ServletException: My Class is not a Servlet 【发布时间】:2017-11-04 17:40:52 【问题描述】:

目前我使用 Spring MVC 和 Spring Boot 开发一个 Web 应用程序。

我试图将 Spring Boot 应用程序打包为战争。我修改了我的应用程序类:

@SpringBootApplication  
@ComponentScan
@EnableAutoConfiguration
public class AuditConfigurationApplication extends SpringBootServletInitializer 

    protected SpringApplicationBuilder configure(SpringApplicationBuilder application) 
        return application.sources(AuditConfigurationApplication.class);
    

    public static void main(String[] args) 
        SpringApplication.run(AuditConfigurationApplication.class, args);
    

-pom.xml 文件:

<dependencies>

    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
    </dependency>


    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-tomcat</artifactId>
        <scope>provided</scope>
    </dependency> 

        <!-- spring data -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-jpa</artifactId>
        </dependency>

         <!-- pdfbox -->
        <dependency>
           <groupId>org.apache.pdfbox</groupId>
           <artifactId>pdfbox</artifactId>
           <version>2.0.1</version>
          </dependency>

   <!-- itextpdf -->
       <dependency>
           <groupId>com.itextpdf</groupId>
           <artifactId>itextpdf</artifactId>
           <version>5.0.6</version>
        </dependency>

     <dependency>
    <groupId>javax.ws.rs</groupId>
    <artifactId>javax.ws.rs-api</artifactId>
    <version>2.0</version>
    </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
         </dependency>

    <!-- mysql-connector -->
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <scope>runtime</scope>
        </dependency>

    <dependency>
    <groupId>org.apache.tomcat.embed</groupId>
    <artifactId>tomcat-embed-jasper</artifactId>
    <version>8.5.11</version>
</dependency>

      <!-- Spring security  -->
        <dependency>
            <groupId>org.springframework.security</groupId>
            <artifactId>spring-security-config</artifactId>
            <version>4.0.3.RELEASE</version>
         </dependency>

         <dependency>
            <groupId>org.springframework.security</groupId>
            <artifactId>spring-security-config</artifactId>
            <version>4.0.3.RELEASE</version>
         </dependency>

         <dependency>
             <groupId>org.springframework.security</groupId>
             <artifactId>spring-security-web</artifactId>
            <version>4.0.3.RELEASE</version>
       </dependency>

        <!-- ecj for exception "No Java compiler available"  -->
       <dependency>
             <groupId>org.eclipse.jdt.core.compiler</groupId>
             <artifactId>ecj</artifactId>
            <version>4.6.1</version>
            <scope>provided</scope>
      </dependency>

        <!-- for uri:  -->
     <dependency>
        <groupId>jstl</groupId>
        <artifactId>jstl</artifactId>
        <version>1.2</version>
        <scope>provided</scope>
    </dependency>

     <dependency>
       <groupId>javax.servlet.jsp.jstl</groupId>
         <artifactId>jstl-api</artifactId>
         <version>1.2</version>
    </dependency>
    <dependency>
        <groupId>javax.servlet</groupId>
       <artifactId>javax.servlet-api</artifactId>
       <version>3.1.0</version>
      <scope>provided</scope>
    </dependency>
   <dependency>
     <groupId>javax.servlet.jsp</groupId>
     <artifactId>jsp-api</artifactId>
     <version>2.2</version>
     <scope>provided</scope>
  </dependency>

        <dependency>
        <groupId>javax.servlet</groupId>
        <artifactId>jstl</artifactId>
     </dependency>     
   <!-- For JSON Object -->
<dependency>
    <groupId>com.googlecode.json-simple</groupId>
    <artifactId>json-simple</artifactId>
    <version>1.1</version>
</dependency>

</dependencies>

-我的控制器休息:

package com.SSC.Services.REST;

@CrossOrigin
@RestController
@RequestMapping("/Employees")
public class UtilisateursRestController 

@RequestMapping(value="/ALL", method=RequestMethod.GET)
    public List<Users> AllUsers()
    return UM.listeT();
    


web.xml version="3.1":
<!-- ====================================================== -->
  <!--  2. Define servlet with private context               -->
  <!-- ===================================================== -->
  <servlet>
    <servlet-name>audit</servlet-name>
    <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
    <load-on-startup>1</load-on-startup>
  </servlet>
  <!-- ===================================================== -->
  <!-- One servlet, the audit, to rule it all           -->
  <!-- ===================================================== -->
  <servlet-mapping>
    <servlet-name>audit</servlet-name>
    <url-pattern>/</url-pattern>
  </servlet-mapping>

 <servlet>
        <servlet-name>Users</servlet-name>
        <servlet-class>com.SSC.Services.REST.UtilisateursRestController</servlet-class>
    </servlet> 
    <servlet-mapping>
        <servlet-name>Users</servlet-name>
        <url-pattern>/Employees/*</url-pattern> //URL of controller REST
    </servlet-mapping>

<error-page>
 <error-code>404</error-code>
 <location>/404</location>
</error-page>

-audit-servlet.xml:

<beans>
<!-- register controller in servlet private context -->
  <context:component-scan base-package="com.SSC.Services.REST"/>  

</beans>

-我将我的项目“Apps”作为战争文件导出到“C:\apache-tomcat-8.5.15\webapps\”。 Tomcat 创建文件夹“Apps”,其中包含所有内容:

Apps
  --META-INF
     -maven
     -MANIFEST.MF
     -war-tracker
  --WEB-INF
      -classes
           -com
           -static
           -application.properties
      - lib-provided
      -lib
      - web.xml + audit-servlet.xml
  --org
  -- My JSP pages ..

当我访问 API REST:http://95.x.x.x/Apps(Name of floder)/Employees/ALL 时,我收到以下错误消息:

javax.servlet.ServletException:类 [com.SSC.Services.REST.UtilisateursRestController] 不是 Servlet Apache Tomcat / 8.5.15

如何解决这个问题?

谢谢,

【问题讨论】:

UtilisateursRestController 不是 servlet。您尝试将控制器映射到 servlet ,它会引发异常。 感谢您的解释,但是如何解决这个问题@VNT?如何确保访问我的 REST API? 删除 web.xml 并请阅读参考指南的很好的文档 section on how to create a deployable war(在这方面您的依赖关系有点混乱)。 servlet映射怎么做?如果您删除web.xml@M。 Deinum 您正在使用 Spring Boot,使用它来进行映射。此外,您不是在映射 servlet,而是在映射控制器...... 【参考方案1】:

您的web.xml 是这里的罪魁祸首,而您的依赖项则是第二个竞争者。另请参阅 Spring Boot 参考指南,其中有一个关于 creating a deployable war 的精彩部分。您可能还想看看 GitHub 上的 war sample。

首先删除您不需要的web.xml。您的AuditConfigurationApplication 也是SpringBootServletInitializer,它负责在servlet 容器中引导应用程序(而不是可执行)。

接下来你的依赖也有点不稳定。您应该使用 spring-boot-starter-security 而不是手动定义 Spring Security 依赖项。您应该为嵌入式库使用另一个依赖项。

<!-- Spring security  -->
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-security</artifactId>
</dependency>

您应该提供以下内容

<!-- Provided (for embedded war support) -->
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-tomcat</artifactId>
    <scope>provided</scope>
</dependency>
<dependency>
    <groupId>org.apache.tomcat.embed</groupId>
    <artifactId>tomcat-embed-jasper</artifactId>
    <scope>provided</scope>
</dependency>

根据您的依赖关系判断,您也在使用 JSP(尽管我现在建议使用 Thymeleaf 之类的东西),您可能需要阅读参考指南中的 JSP Limitations 部分并查看 @987654324 中所需的依赖项@在 GitHub 上。

您不需要 servlet-api 已包含在 spring-boot-starter-web 中的依赖项。

【讨论】:

以上是关于Apache Tomcat-javax.servlet.ServletException:我的类不是 Servlet的主要内容,如果未能解决你的问题,请参考以下文章

Apache 服务

我怎么在LINUX下查看apache日志

Linux中怎样启动apache服务

启动apache时出现xampp错误说停止apache

如何解决 apache htacess 不生效

如何在Linux下搭建apache服务器