2011-08-11 2 views
7

Я пытаюсь изучить аннотации. В настоящее время у меня есть webapp, который запускает init(), когда приложение запускается в Tomcat.аннотация @WebServlet не распознана; init не запускается

Следующий код работает ...

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

Однако, когда я раскомментировать @WebServlet аннотацию и закомментируйте запись сервлета в web.xml, метод init не запускается.

Я пропустил что-то очевидное?

В случае, если это поможет, это мой 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

Выполняется ли метод 'init()' при переходе на '/ main.jsp'? – axtavt

+1

Нет, он не регистрирует сервлет с контейнером вообще. У меня есть несколько других сервлетов, которые расширяют HttpServlet и их методы обслуживания, которые имеют контент, также не запускаются. – Custard

ответ

16

Убедитесь, что вы работаете в сервлет 3,0 контейнера - TOMCAT 7, например (Tomcat 6 не поддерживает сервлет 3,0)

Затем попробуйте указать <web-app metadata-complete="false" /> - по умолчанию оно должно быть ложным, но попробуйте.

+0

Благодаря Bozho, он сейчас работает :) Я также должен был изменить несколько зависимостей, чтобы остановить несколько версий Hibernate включаются: Добавить это ...: org.springframework весна веб .. .И это: org.springframework весна-ОРМ Снимите: org.hibernate Hibernate-аннотаций Custard

+0

В чем проблема? Контейнер сервлета или полные метаданные? – Bozho

+0

Я запускал Tomcat 6, который был связан с более старой версией NetBeans, с которой я был [вынужден использовать]. Теперь у меня есть NB 7.0.1/Tomcat 7, который, как вы сказали, имеет 3.0-сервлет-контейнер. Мне не нужно было указывать полное значение метаданных. – Custard

0

В соответствии с Servlet 3.0 spec класс с использованием аннотации @WebServlet должен распространяться на HttpServlet. Это может означать, что ваш GenericServlet просто не будет.

8

У вашего приложения может быть web.xml в старом формате, что делает JBoss игнорировать любые аннотированные классы. Так что, если ваш web.xml выглядит следующим образом:

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

затем изменить его на:

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

Это удостоверится JBoss обрабатывает войну как сервлета 3.0 снова.

Смежные вопросы