2011-08-11 19 views
7

Estoy tratando de aprender anotaciones. Actualmente tengo una aplicación web que ejecuta un init() cuando la aplicación se inicia en Tomcat.Anotación de @WebServlet no reconocida; init no se ejecuta

El código siguiente funciona ...

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 { } 
} 

Sin embargo, cuando elimine el comentario de anotación @WebServlet y comente las entrada de servlet en web.xml, el método init no se ejecuta.

¿Me falta algo obvio?

En caso de que esto va a ayudar, este es mi 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> 
+0

¿Se ejecuta el método 'init()' cuando navega a '/ main.jsp'? – axtavt

+1

No, no está registrando el servlet con el contenedor. Tengo algunos otros servlets que extienden HttpServlet y sus métodos de servicio, que tienen contenido, tampoco se ejecutan. Gracias – Custard

Respuesta

16

Asegúrese de que está ejecutando en un servlet 3.0 contenedor - Tomcat 7, por ejemplo (Tomcat 6 no soporta servlet 3.0)

Luego intente especificar <web-app metadata-complete="false" /> - debe ser falso de forma predeterminada, pero pruébelo.

+0

Bozho, está funcionando ahora :) También tuve que cambiar algunas dependencias para detener varias versiones de Hibernate está incluido: Añadir esta ...: org.springframework primavera en la web .. .y esto: org.springframework primavera-ORM retirar: org.hibernate de hibernación-anotaciones Custard

+0

¿cuál fue el problema exactamente? El contenedor de servlets, o los metadatos, ¿completan? – Bozho

+0

Estaba ejecutando Tomcat 6, que estaba incluido con la versión anterior de NetBeans que estaba [forzado a usar]. Ahora tengo NB 7.0.1/Tomcat 7 que, como dijiste, tiene el contenedor de 3.0 servlets. No tuve que especificar el valor de metadata completo. – Custard

0

De acuerdo con Servlet 3.0 spec, la clase que utiliza la anotación @WebServlet tiene que extenderse HttpServlet. Eso podría significar que su GenericServlet simplemente no funcionará.

8

Su aplicación podría tener un archivo web.xml en un formato antiguo, por lo que JBoss ignorará las clases anotadas. Así que si su web.xml se parece a:

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

luego cambiarlo a:

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

Esto se asegurará de JBoss se encarga de la guerra como servlet 3.0 nuevo.

Cuestiones relacionadas