2016-08-17 46 views
2

當我嘗試連接到數據庫時,出現500錯誤並關閉了我的eclipse/tomcat。有誰知道我該如何修復它?Tomcat無法連接到數據庫錯誤狀態500 java.lang.ClassNotFoundException

確認的Servlet

package be.pxl.tafelboeker.servlets; 

import be.pxl.tafelboeker.dao.BoekingDAO; 
import be.pxl.tafelboeker.domain.Boeking; 
import be.pxl.tafelboeker.services.BoekingService; 

import javax.servlet.ServletException; 
import javax.servlet.annotation.WebInitParam; 
import javax.servlet.annotation.WebServlet; 
import javax.servlet.http.HttpServlet; 
import javax.servlet.http.HttpServletRequest; 
import javax.servlet.http.HttpServletResponse; 
import javax.servlet.http.HttpSession; 

import java.io.IOException; 

@WebServlet(value = "/Confirm", initParams = { 
      @WebInitParam(name = "ConfirmPage", 
       value = "/confirm.jsp") }) 
public class ConfirmServlet extends HttpServlet { 
    private String ConfirmPage; 
    private String geluktPage; 
    private String misluktPage; 
    private BoekingService service = new BoekingService(); 



    @Override 
    public void init() throws ServletException { 
     // TODO Auto-generated method stub 
     super.init(); 
     ConfirmPage = getInitParameter("ConfirmPage"); 
     geluktPage ="gelukt.jsp"; 
     misluktPage = "mislukt.jsp"; 
    } 

    @Override 
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { 
     Boeking bean = new Boeking(); 
     HttpSession sess = request.getSession(); 
     bean = (Boeking)sess.getAttribute("bean"); 
     request.setAttribute("bean", bean); 
     request.getRequestDispatcher(ConfirmPage).forward(request,response); 

    } 

    @Override 
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { 
     // TODO STUDENT : boek tafel, toon gelukt.jsp indien de boeking gelukt is en toon mislukt.jsp indien de tafel niet geboekt kan worden 
     Boeking bean = new Boeking(); 
     HttpSession sess = request.getSession(); 
     bean = (Boeking)sess.getAttribute("bean"); 
     BoekingDAO dao = new BoekingDAO("jdbc:mysql://localhost/survey", "root", ""); 
     BoekingService serv = new BoekingService(); 
     serv.setDao(dao); 



     if (serv.boekTafel(bean)) { 
      request.getRequestDispatcher(geluktPage).include(request,response); 
     } else { 
      request.getRequestDispatcher(misluktPage).include(request,response); 
     } 

     //Krijg een error bij het aanroepen van mijn Persistence krijg deze pas vandaag als ik mijn oefeningen van gister wil openen die werkte krijg ik het nu ook 
       //Dit is zeer vervelend. Kan nu niet testen of mijn query en de rest wel klopt. 
       //Heb mijn best gedaan om het zo goed mogelijk in te zullen 
       //Hetzelfde geld voor overzichtservlet & overzicht.jsp die ook dezelfde fout krijgen 

    } 
} 

的預訂道

package be.pxl.tafelboeker.dao; 

import be.pxl.tafelboeker.domain.Boeking; 

import javax.persistence.EntityManagerFactory; 
import javax.persistence.EntityManager; 
import javax.persistence.Persistence; 
import javax.persistence.Query; 

import java.time.LocalDate; 
import java.util.Calendar; 
import java.util.Date; 
import java.util.List; 

public class BoekingDAO { 

    private String url; 
    private String user; 
    private String password; 

    EntityManagerFactory emf; 

    public BoekingDAO(String url, String user, String password) { 
     this.url = url; 
     this.user = user; 
     this.password = password; 
    } 

    public void setDriver(String driver) 
      throws ClassNotFoundException { 
      Class.forName("com.mysql.jdbc.Driver"); 
     } 

    private EntityManager getEntityManager() { 
     emf = Persistence.createEntityManagerFactory("booking"); 
     EntityManager em = emf.createEntityManager(); 
     return em; 

    } 

    // TIP : Gebruik TemporalType.DATE voor je query parameter 
    public boolean isTafelBeschikbaar(LocalDate dag, int uur) { 
     EntityManager em = getEntityManager(); 
     Query q1 = em.createQuery("select b from booking as b where (b.dag=?1 AND b.uur =?2) "); 
     q1.setParameter(1, dag); 
     q1.setParameter(2, uur); 
     if (q1.getMaxResults() == 0) { 
      return true; 
     } else { 
      return false; 
     } 

    } 

    public void boekTafel(Boeking bean) { 
     EntityManager em = getEntityManager(); 
     em.persist(bean); 
     em.close(); 
     emf.close(); 

    } 

    public String getUrl() { 
     return url; 
    } 

    public void setUrl(String url) { 
     this.url = url; 
    } 

    public String getUser() { 
     return user; 
    } 

    public void setUser(String user) { 
     this.user = user; 
    } 

    public String getPassword() { 
     return password; 
    } 

    public void setPassword(String password) { 
     this.password = password; 
    } 



} 

DriverLoader

package be.pxl.tafelboeker.dao; 

public class DriverLoader { 
    static{ 
     System.out.print("loading database"); 
     try { 
      Class.forName("com.mysql.jdbc.Driver"); 
     } catch (ClassNotFoundException e) { 
      System.out.println("nope"); 
      e.printStackTrace(); 
     } 
    } 

} 

的預訂服務

package be.pxl.tafelboeker.services; 

import be.pxl.tafelboeker.dao.BoekingDAO; 
import be.pxl.tafelboeker.domain.Boeking; 

import java.time.LocalDate; 
import java.util.Date; 

public class BoekingService { 

    private BoekingDAO dao; 

    public BoekingService(){ 
    } 


    public BoekingDAO getDao() { 
     return dao; 
    } 


    public void setDao(BoekingDAO dao) { 
     this.dao = dao; 
    } 


    private boolean isTafelBeschikbaar(LocalDate dag, int uur){ 
     return dao.isTafelBeschikbaar(dag, uur) ; 
    } 

    public boolean boekTafel(Boeking boeking){ 
     LocalDate dag = boeking.getDag(); 
     int uur = boeking.getUur(); 
     if(isTafelBeschikbaar(dag, uur)){ 
      dao.boekTafel(boeking); 
      return true; 
     } 
     return false; 
    } 
} 

POM

<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>be.pxl</groupId> 
    <artifactId>HerexamensOef</artifactId> 
    <packaging>war</packaging> 
    <version>0.0.1-SNAPSHOT</version> 
    <name>HerexamensOef Maven Webapp</name> 
    <url>http://maven.apache.org</url> 
    <dependencies> 
    <dependency> 
     <groupId>junit</groupId> 
     <artifactId>junit</artifactId> 
     <version>3.8.1</version> 
     <scope>test</scope> 
    </dependency> 
    <dependency> 
      <groupId>javax</groupId> 
      <artifactId>javaee-web-api</artifactId> 
      <version>7.0</version> 
      <scope>provided</scope> 
     </dependency> 

     <dependency> 
    <groupId>javax.servlet</groupId> 
    <artifactId>jstl</artifactId> 
    <version>1.2</version> 
</dependency> 

    </dependencies> 
    <build> 
    <finalName>HerexamensOef</finalName> 
    </build> 
</project> 

持久性

<?xml version="1.0" encoding="UTF-8"?> 
<persistence xmlns="http://xmlns.jcp.org/xml/ns/persistence" 
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/persistence 
http://xmlns.jcp.org/xml/ns/persistence/persistence_2_1.xsd" 
    version="2.1"> 
    <persistence-unit name="booking" transaction-type="RESOURCE_LOCAL"> 
     <properties> 
      <property name="javax.persistence.jdbc.driver" value="com.mysql.jdbc.Driver" /> 
      <property name="javax.persistence.jdbc.url" value="jdbc:mysql://localhost/booking" /> 
      <property name="javax.persistence.jdbc.user" value="root" /> 
      <property name="javax.persistence.jdbc.password" value="" /> 
      <property name="javax.persistence.schema-generation.database.action" 
       value="none" /> 
      <!-- Hibernate specific --> 
      <property name="hibernate.show_sql" value="true" /> 
     </properties> 
    </persistence-unit> 
</persistence> 

錯誤

HTTP Status 500 - Servlet execution threw an exception 

type Exception report 

message Servlet execution threw an exception 

description The server encountered an internal error that prevented it from fulfilling this request. 

exception 

javax.servlet.ServletException: Servlet execution threw an exception 
    org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52) 

root cause 

java.lang.NoClassDefFoundError: javax/persistence/Persistence 
    be.pxl.tafelboeker.dao.BoekingDAO.getEntityManager(BoekingDAO.java:35) 
    be.pxl.tafelboeker.dao.BoekingDAO.isTafelBeschikbaar(BoekingDAO.java:43) 
    be.pxl.tafelboeker.services.BoekingService.isTafelBeschikbaar(BoekingService.java:28) 
    be.pxl.tafelboeker.services.BoekingService.boekTafel(BoekingService.java:34) 
    be.pxl.tafelboeker.servlets.ConfirmServlet.doPost(ConfirmServlet.java:59) 
    javax.servlet.http.HttpServlet.service(HttpServlet.java:648) 
    javax.servlet.http.HttpServlet.service(HttpServlet.java:729) 
    org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52) 

note The full stack trace of the root cause is available in the Apache Tomcat/8.0.33 logs. 

預訂的SQL

-- phpMyAdmin SQL Dump 
-- version 4.4.10 
-- http://www.phpmyadmin.net 
-- 
- 

    - Host: localhost 
    -- Generation Time: Jun 03, 2016 at 06:50 PM 
    -- Server version: 5.5.42 
    -- PHP Version: 7.0.0 

    SET SQL_MODE = "NO_AUTO_VALUE_ON_ZERO"; 
    SET time_zone = "+00:00"; 

    -- 
    -- Database: `boekingdb` 
    -- 

    -- -------------------------------------------------------- 

    -- 
    -- Table structure for table `BOOKING` 
    -- 

    CREATE TABLE `BOOKING` (
     `id` bigint(20) NOT NULL, 
     `DAY` date DEFAULT NULL, 
     `NAME` varchar(255) DEFAULT NULL, 
     `CITY` varchar(255) DEFAULT NULL, 
     `STREET` varchar(255) DEFAULT NULL, 
     `HOUR` int(11) DEFAULT NULL 
    ) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=latin1; 


    -- 
    -- Indexes for table `BOOKING` 
    -- 
    ALTER TABLE `BOOKING` 
     ADD PRIMARY KEY (`id`); 

    -- 
    -- AUTO_INCREMENT for dumped tables 
    -- 

    -- 
    -- AUTO_INCREMENT for table `BOOKING` 
    -- 
    ALTER TABLE `BOOKING` 
     MODIFY `id` bigint(20) NOT NULL AUTO_INCREMENT,AUTO_INCREMENT=4; 
+1

看到http://stackoverflow.com/questions/27420513/what-is-jpa-provider –

+0

@ScaryWombat同樣的錯誤隊友:(嗯,我的意思是一個它說META-INF –

回答

3

你的持久性文件,使用JPA架構2.1版:

<persistence xmlns="http://xmlns.jcp.org/xml/ns/persistence" 
      xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
      xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/persistence 
      http://xmlns.jcp.org/xml/ns/persistence/persistence_2_1.xsd" 
      version="2.1"> 

所以你應該使用匹配的休眠版本:分鐘休眠4.3.X. 我猜你在你的persistence.xml

<property name="hibernate.show_sql" value="true" /> 

所以使用Hibernate的緣故吧,如果你想使用JPA的接口,你應該增加這種依賴在你的pom.xml:

<dependency> 
    <groupId>org.hibernate</groupId> 
    <artifactId>hibernate-entitymanager</artifactId> 
    <version>5.2.2.Final</version> 
</dependency> 

這依賴關係包括hibernate-jpa-2.1-api其中包含類javax.persistence.Persistence

否則如果您想直接使用Hibernate而不使用JPA作爲接口,則可以使用此依賴關係(或+ 4.3。X):

<dependency> 
    <groupId>org.hibernate</groupId> 
    <artifactId>hibernate-core</artifactId> 
    <version>5.2.2.Final</version> 
</dependency> 

更多細節在這裏:http://hibernate.org/orm/downloads/

+0

好吧,但添加JPA到我的項目不會讓我的錯誤消失。這個項目是爲我的外殼程序而來的,但在這裏我不需要使用JPA,就像我通常所做的那樣。我也有JPA和Hibernate的項目。我的問題保持不變。我怎麼能修復這個錯誤?並讓我的項目運行? –

+0

您是否嘗試過添加hibernate-entitymanager依賴項?我犯了一個錯字 – davidxxx

+0

是的,我解決了這個問題,但得到了一個新的映射,我做了一個帖子,以及如果你可以幫助那一個,它會很好:$ –

0

你必須位於javax.persistence-api.jar中添加作爲一個依賴:

<!-- https://mvnrepository.com/artifact/javax.persistence/persistence-api --> 
<dependency> 
    <groupId>javax.persistence</groupId> 
    <artifactId>persistence-api</artifactId> 
    <version>1.0.2</version> 
</dependency> 
+1

我想你還需要添加一個JPA提供程序,例如Hibernate或EclipseLink –

+0

解決了現在我有這個錯誤 沒有名爲META-INF/services/javax.persistence.spi.PersistenceProvider的資源文件請確保持久性提供程序jar文件位於你的類路徑中 –

相關問題