2017-06-03 36 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

相关问题