JSP с maven и hibernate - java.lang.NoSuchMethodError, возможно, проблема со структурой проекта
У меня проблема с моим школьным проектом. Я использую Hibernate, JSP и Maven для управления зависимостями. Hibernate и 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
index.jsp:
<jsp:useBean id="login" scope="page" class="cz.fim.pro3.utils.LoginHandler" />
...
login.verifyUser(request.getParameter("userName"), request.getParameter("password"));
LoginHandler.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");
}
pom.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)
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.
Помимо вышесказанного, вы должны вызвать правильный метод в строке 11 HibernateDao.java, где вы пытаетесь вызвать метод openSession, который, очевидно, не существует.