2017-06-03 49 views
1

目前,我發展與Spring MVC和春天啓動的Web應用程序。的Apache Tomcat,javax.servlet.ServletException:我的班級是不是一個Servlet

我試圖打包彈簧啓動應用程序的戰爭。我修改了應用類:

@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); 
    } 

-The 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> 

-My控制器休息:

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> 

-I導出我的項目 「應用程序」 戰爭文件到 「C:\ Apache的Tomcat的8.5.15 \的webapps \」。 Tomcat的創建文件夾 「應用程序」,它包含了一切:

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

如何解決這個問題?

謝謝

+0

UtilisateursRestController不是一個servlet。你試圖將一個控制器映射到一個servlet,它會拋出異常。 – VNT

+0

感謝您的解釋,但如何解決這個問題@VNT?如何確保訪問我的REST API? – Michael1

+0

刪除'web.xml',並請閱讀很好的文檔[關於如何創建可部署戰爭的部分](https://docs.spring.io/spring-boot/docs/current/reference/htmlsingle/#howto -create-a-deployable-war-file)的參考指南(您的依賴關係在這方面有點混亂)。 –

回答

0

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節參考指南和看一看在JSP sample GitHub上所需要的依賴關係。

您不需要已包含在spring-boot-starter-web中的servlet-api相關性。

+0

非常感謝你@M。 Deinum,它的工作原理 – Michael1

相關問題