@WebServlet annotation not recognized; init does not start

I am trying to learn annotations. I currently have a webapp that runs init () when the application launches in Tomcat.

The following code works ...

web.xml:

<?xml version="1.0" encoding="UTF-8"?> <web-app xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" version="3.0"> <servlet> <servlet-name>MainServlet</servlet-name> <servlet-class>com.company.Main</servlet-class> <load-on-startup>1</load-on-startup> </servlet> </web-app> 

Main.java:

 import java.io.IOException; import javax.servlet.*; import javax.servlet.annotation.WebServlet; //@WebServlet(name="MainServlet", value="/main.jsp", loadOnStartup=1) public class Main extends GenericServlet { public Main() { } @Override public void init() { System.out.println("Hello!"); } @Override public void destroy() { System.out.println("Bye!"); } @Override public void service(ServletRequest req, ServletResponse res) throws ServletException, IOException { } } 

However, when I uncomment the @WebServlet annotation and comment out the servlet entry in web.xml, the init method does not start.

Am I missing something obvious?

In case this helps, this is my pom.xml:

 <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>...</groupId> <artifactId>...</artifactId> <packaging>war</packaging> <version>1.0-SNAPSHOT</version> <name>Name</name> <url>http://maven.apache.org</url> <build> <plugins> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-compiler-plugin</artifactId> <version>2.0.2</version> <configuration> <source>1.6</source> <target>1.6</target> </configuration> </plugin> </plugins> </build> <dependencies> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>3.8.1</version> <scope>test</scope> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-core</artifactId> <version>3.0.5.RELEASE</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-tx</artifactId> <version>3.0.5.RELEASE</version> </dependency> <dependency> <groupId>org.hibernate</groupId> <artifactId>hibernate-core</artifactId> <version>3.6.6.Final</version> </dependency> <dependency> <groupId>org.hibernate</groupId> <artifactId>hibernate-annotations</artifactId> <version>3.5.6-Final</version> </dependency> <dependency> <groupId>javax</groupId> <artifactId>javaee-web-api</artifactId> <version>6.0</version> <scope>provided</scope> </dependency> </dependencies> </project> 
+7
source share
3 answers

Make sure you are working in a servlet 3.0 container - tomcat 7, for example (tomcat 6 does not support servlet 3.0)

Then try specifying <web-app metadata-complete="false" /> - by default it should be false, but try.

+16
source

Your application may have a web.xml file in the old format, as a result of which JBoss ignores any annotated classes. Therefore, if your web.xml looks like this:

 <!DOCTYPE web-app PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN" "http://java.sun.com/dtd/web-app_2_3.dtd" > <web-app> <display-name>Archetype Created Web Application</display-name> </web-app> 

then change it to:

 <web-app xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" version="3.0"> <display-name>Archetype Created Web Application</display-name> </web-app> 

This will make sure that JBoss is dealing with the war again as a servlet 3.0.

+8
source

According to the Servlet 3.0 spec, a class using the @WebServlet annotation should extend the HttpServlet . This may mean that your GenericServlet simply will not.

0
source

All Articles