JSP с maven и hibernate - java.lang.NoSuchMethodError, возможно, проблема со структурой проекта

У меня проблема с моим школьным проектом. Я использую hibernate, jsp и maven для управления зависимостями. Спящий режим и maven работают нормально, но когда я пытаюсь создать простую страницу jsp с экраном входа в систему. Это не работает. Я думаю, проблема в maven и в том, как он работает со структурой проекта, потому что, если я сделаю тестовый класс, все заработает. Я не могу найти ничего о том, как maven работает с веб-приложениями.

Извините за мои ошибки в английском :).

структура моего проекта:

├── src
│   └── main
│       ├── java
│       │    │
│       │    pro3
│       │     ├── model
│       │     │   ├── dao
│       │     │   │   ├── DaoInterface.java
│       │     │   │   └── HibernateDao.java
│       │     │   ├── hibernate
│       │     │   │   ├── hibernate.cfg.xml
│       │     │   │   ├── hibernate.reveng.xml
│       │     │   │   ├── HibernateUtil.java
│       │     │   │   ├── mapping
│       │     │   │   │   ├── Meal.hbm.xml
│       │     │   │   │   ├── ...
│       │     │   │   │   
│       │     │   │   └── Test.java
│       │     │   └── pojo
│       │     │       ├── Meal.java
│       │     │       ├── ...
│       │     │      
│       │     │      
│       │     └── utils
│       │         └── LoginHandler.java
│       └── webapp
│           └── index.jsp

Индекс.jsp:

<jsp:useBean id="login" scope="page" class="cz.fim.pro3.utils.LoginHandler" />
...
login.verifyUser(request.getParameter("userName"), request.getParameter("password"));

Логинхандлер.java:

public class LoginHandler {
    DaoInterface dao = new HibernateDao();


    public boolean verifyUser(String userName,String password){
        return dao.verifyUser(userName, password);
    }
}

HibernateDao.java:

public boolean verifyUser(String userName, String password)


В моем тестовом классе все работает нормально, когда я запускаю его как java-приложение.

Тест:

public static void main(String[] args) {
    new Test();
    LoginHandler login = new LoginHandler();
    login.verifyUser("sdf", "asda");
}

пом.xml:

<build>
    <plugins>
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-war-plugin</artifactId>
            <configuration>
                <archive>
                    <manifest>
                        <addClasspath>true</addClasspath>
                        <classpathPrefix>lib/</classpathPrefix>
                    </manifest>
                </archive>
                <webResources>
                    <resource>
                        <!-- this is relative to the pom.xml directory -->
                        <directory>src/main/webapp</directory>
                        <targetPath>/</targetPath>
                        <!-- enable filtering -->
                        <filtering>false</filtering>
                    </resource>
                </webResources>
            </configuration>
        </plugin>
        <plugin>
            <artifactId>maven-compiler-plugin</artifactId>
            <configuration>
                <source>1.7</source>
                <target> 1.7</target>
            </configuration>
        </plugin>
    </plugins>
</build>

<packaging>war</packaging>

след ошибки:

Stacktrace:] with root cause
java.lang.NoSuchMethodError: org.hibernate.SessionFactory.openSession()Lorg/hibernate/Session;
    at cz.fim.pro3.model.dao.HibernateDao.verifyUser(HibernateDao.java:11)
    at cz.fim.pro3.utils.LoginHandler.verifyUser(LoginHandler.java:11)
    at org.apache.jsp.index_jsp._jspService(index_jsp.java:83)
    at org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:70)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:722)
    at org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:419)
    at org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:391)
    at org.apache.jasper.servlet.JspServlet.service(JspServlet.java:334)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:722)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:304)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210)
    at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:240)
    at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:164)
    at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:462)
    at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:164)
    at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:100)
    at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:562)
    at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:118)
    at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:395)
    at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:250)
    at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:188)
    at org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:302)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1110)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:603)
    at java.lang.Thread.run(Thread.java:722)

person enkor    schedule 21.05.2012    source источник
comment
См. здесь, если проблема не решена, опубликуйте полный источник pom.xml..   -  person Pau Kiat Wee    schedule 21.05.2012
comment
большое тебе спасибо. Это не решило мою проблему напрямую, но дало мне правильный путь.   -  person enkor    schedule 21.05.2012


Ответы (1)


Первое, что я могу порекомендовать, это изменить расположение ваших файлов, потому что в Maven вам нужно соблюдайте некоторые соглашения:

Файлы Java следует поместить в src/main/java и указать соответствующее имя пакета. Файл hibernate.cfg.xml и hibernate.reveng.xml НЕ принадлежат src/main/java, они должны быть расположены в src/main/resources плюс подходящее имя пакета, в которое вы хотите их поместить. Кроме того, в спящем режиме отображение должно обрабатываться аннотациями, а не файлами hbm. Но если вам нужно застрять с файлами отображений, их также нужно поместить в src/main/resources.

Если у вас есть какие-то тесты (обычно модульные тесты), такие как Test.java, их нужно поместить в src/test/java, любые ресурсы, которые относятся к модульным тестам, нужно только поместить в src/test/resources плюс соответствующее имя пакета. Файл jsp был правильно расположен в src/main/webapp.

Помимо вышеперечисленного, вы должны вызвать правильный метод в строке HibernateDao.java 11, где вы пытаетесь вызвать метод openSession, который, очевидно, не существует.

person khmarbaise    schedule 21.05.2012