2017-05-26 17 views
-1

有可能是我在這裏失蹤的東西,但我一直沒能弄明白。錯誤說「java.lang.ClassCastException:java.util.ArrayList不能被轉換爲」當我甚至沒有投入ArrayList到類

所以我寫了一個Servlet,它本質上是設計用來幫助我從數據庫或書本下載文件,如果您願意的話。現在我知道了這個錯誤:

22:05:18,349 ERROR [io.undertow.request] (default task-6) UT005023: Exception handling request to /PubHub/DownloadBook: java.lang.ClassCastException: java.util.ArrayList cannot be cast to examples.pubhub.model.Book at examples.pubhub.servlets.DownloadBookServlet.doGet(DownloadBookServlet.java:37) at javax.servlet.http.HttpServlet.service(HttpServlet.java:687) at javax.servlet.http.HttpServlet.service(HttpServlet.java:790) at io.undertow.servlet.handlers.ServletHandler.handleRequest(ServletHandler.java:85) at io.undertow.servlet.handlers.FilterHandler$FilterChainImpl.doFilter(FilterHandler.java:129) at org.apache.logging.log4j.web.Log4jServletFilter.doFilter(Log4jServletFilter.java:71) at io.undertow.servlet.core.ManagedFilter.doFilter(ManagedFilter.java:61) at io.undertow.servlet.handlers.FilterHandler$FilterChainImpl.doFilter(FilterHandler.java:131) at io.undertow.servlet.handlers.FilterHandler.handleRequest(FilterHandler.java:84) at io.undertow.servlet.handlers.security.ServletSecurityRoleHandler.handleRequest(ServletSecurityRoleHandler.java:62) at io.undertow.servlet.handlers.ServletDispatchingHandler.handleRequest(ServletDispatchingHandler.java:36) at org.wildfly.extension.undertow.security.SecurityContextAssociationHandler.handleRequest(SecurityContextAssociationHandler.java:78) at io.undertow.server.handlers.PredicateHandler.handleRequest(PredicateHandler.java:43) at io.undertow.servlet.handlers.security.SSLInformationAssociationHandler.handleRequest(SSLInformationAssociationHandler.java:131) at io.undertow.servlet.handlers.security.ServletAuthenticationCallHandler.handleRequest(ServletAuthenticationCallHandler.java:57) at io.undertow.server.handlers.PredicateHandler.handleRequest(PredicateHandler.java:43) at io.undertow.security.handlers.AuthenticationConstraintHandler.handleRequest(AuthenticationConstraintHandler.java:53) at io.undertow.security.handlers.AbstractConfidentialityHandler.handleRequest(AbstractConfidentialityHandler.java:46) at io.undertow.servlet.handlers.security.ServletConfidentialityConstraintHandler.handleRequest(ServletConfidentialityConstraintHandler.java:64) at io.undertow.servlet.handlers.security.ServletSecurityConstraintHandler.handleRequest(ServletSecurityConstraintHandler.java:59) at io.undertow.security.handlers.AuthenticationMechanismsHandler.handleRequest(AuthenticationMechanismsHandler.java:60) at io.undertow.servlet.handlers.security.CachedAuthenticatedSessionHandler.handleRequest(CachedAuthenticatedSessionHandler.java:77) at io.undertow.security.handlers.NotificationReceiverHandler.handleRequest(NotificationReceiverHandler.java:50) at io.undertow.security.handlers.AbstractSecurityContextAssociationHandler.handleRequest(AbstractSecurityContextAssociationHandler.java:43) at io.undertow.server.handlers.PredicateHandler.handleRequest(PredicateHandler.java:43) at org.wildfly.extension.undertow.security.jacc.JACCContextIdHandler.handleRequest(JACCContextIdHandler.java:61) at io.undertow.server.handlers.PredicateHandler.handleRequest(PredicateHandler.java:43) at io.undertow.server.handlers.PredicateHandler.handleRequest(PredicateHandler.java:43) at io.undertow.servlet.handlers.ServletInitialHandler.handleFirstRequest(ServletInitialHandler.java:292) at io.undertow.servlet.handlers.ServletInitialHandler.access$100(ServletInitialHandler.java:81) at io.undertow.servlet.handlers.ServletInitialHandler$2.call(ServletInitialHandler.java:138) at io.undertow.servlet.handlers.ServletInitialHandler$2.call(ServletInitialHandler.java:135) at io.undertow.servlet.core.ServletRequestContextThreadSetupAction$1.call(ServletRequestContextThreadSetupAction.java:48) at io.undertow.servlet.core.ContextClassLoaderSetupAction$1.call(ContextClassLoaderSetupAction.java:43) at io.undertow.servlet.api.LegacyThreadSetupActionWrapper$1.call(LegacyThreadSetupActionWrapper.java:44) at io.undertow.servlet.api.LegacyThreadSetupActionWrapper$1.call(LegacyThreadSetupActionWrapper.java:44) at io.undertow.servlet.api.LegacyThreadSetupActionWrapper$1.call(LegacyThreadSetupActionWrapper.java:44) at io.undertow.servlet.api.LegacyThreadSetupActionWrapper$1.call(LegacyThreadSetupActionWrapper.java:44) at io.undertow.servlet.api.LegacyThreadSetupActionWrapper$1.call(LegacyThreadSetupActionWrapper.java:44) at io.undertow.servlet.api.LegacyThreadSetupActionWrapper$1.call(LegacyThreadSetupActionWrapper.java:44) at io.undertow.servlet.handlers.ServletInitialHandler.dispatchRequest(ServletInitialHandler.java:272) at io.undertow.servlet.handlers.ServletInitialHandler.access$000(ServletInitialHandler.java:81) at io.undertow.servlet.handlers.ServletInitialHandler$1.handleRequest(ServletInitialHandler.java:104) at io.undertow.server.Connectors.executeRootHandler(Connectors.java:202) at io.undertow.server.HttpServerExchange$1.run(HttpServerExchange.java:805) at java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source) at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source) at java.lang.Thread.run(Unknown Source)

意味着我不安全鑄造ArrayList的一個對象,它的ArrayList中不是一個子類。問題是,我甚至沒有將ArrayList投射到該對象,在這種情況下,Book。

我不知道是什麼原因造成的問題,我已經檢查的實體,甚至通過其他地方一樣鑄造搜索:

servlet代碼:

package examples.pubhub.servlets; 

import java.io.ByteArrayInputStream; 
import java.io.IOException; 
import java.io.InputStream; 
import java.io.OutputStream; 

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

import examples.pubhub.dao.BookDAO; 
import examples.pubhub.model.Book; 
import examples.pubhub.utilities.DAOUtilities; 

/** 
* Servlet implementation class DownloadBookservlet 
*/ 
@WebServlet("/DownloadBook") 
public class DownloadBookServlet extends HttpServlet { 
private static final long serialVersionUID = 1L; 



/** 
* @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse 
response) 
*/ 
protected void doGet(HttpServletRequest request, HttpServletResponse 
response) throws ServletException, IOException { 

    /* String isbn = request.getParameter("isbn_13"); */ 

    String isbn = request.getParameter("isbn_13"); 

    BookDAO dao = DAOUtilities.getBookDAO(); 
    Book book = dao.getBookByISBN(isbn); 

    // In order to download the PDF to the client, we need to add a data stream to the response. 
    // First we set the content type to PDF, so the browser knows how to interpret the data it's receiving 
    response.setContentType("application/pdf"); 

    // Then we set the filename to the book's title, so it's not a random string of characters 
    response.setHeader("Content-Disposition", "attachment; filename=" + book.getTitle() + ".pdf"); 

    // Create the input stream (IN to the app FROM the book) 
    InputStream is = new ByteArrayInputStream(book.getContent()); 

    // Create the output stream (OUT of the app TO the client) 
    OutputStream os = response.getOutputStream(); 

    // We're going to read and write 1KB at a time 
    byte[] buffer = new byte[1024]; 

    // Reading returns -1 when there's no more data left to read. 
    while (is.read(buffer) != -1) { 
     os.write(buffer); 
     } 


    // Always close your streams! 
    os.flush(); 
    os.close(); 
    is.close(); 
    } 
} 

代碼爲方法,該方法導致錯誤:

@Override 
public Book getBookByISBN(String isbn) { 

    Session session = DAOUtilities.getSessionFactory().openSession(); 

    session.beginTransaction(); 

    Query query = session.createQuery("from Book where isbn_13 =:isbn_13"); 
    query.setParameter("isbn_13", isbn); 

    Book book = (Book) query.uniqueResult(); 

    session.getTransaction().commit(); 

    return book; 

} 

代碼實際的類/對象/實體,圖書:

package examples.pubhub.model; 

import java.time.LocalDate; 

import javax.persistence.Column; 
import javax.persistence.Entity; 
import javax.persistence.Id; 
import javax.persistence.Table; 

@Entity 
@Table(name = "books") 
public class Book { 

@Id 
@Column(name="isbn_13") 
public String isbn_13; // International Standard Book Number, unique 

@Column(name="title") 
private String title; 

@Column(name="author") 
private String author; 

@Column(name="publish_date") 
private LocalDate publish_date; // Date of publish to the website 

@Column(name="price") 
private double price; 

@Column(name="content") 
private byte[] content; 

// Constructor used when no date is specified 
public Book(String isbn, String title, String author, byte[] content, double price) { 
    super(); 
    this.isbn_13 = isbn; 
    this.title = title; 
    this.author = author; 
    this.publish_date = LocalDate.now(); 
    this.content = content; 
    this.price = price; 
} 

// Constructor used when a date is specified 
public Book(String isbn, String title, String author, LocalDate publishDate, double price, byte[] content) { 
    super(); 
    this.isbn_13 = isbn; 
    this.title = title; 
    this.author = author; 
    this.publish_date = publishDate; 
    this.content = content; 
    this.price = price; 
} 

// Default constructor 
public Book() { 

} 

public String getIsbn_13() { 
    return isbn_13; 
} 

public String getTitle() { 
    return title; 
} 

public void setTitle(String title) { 
    this.title = title; 
} 

public String getAuthor() { 
    return author; 
} 

public void setAuthor(String author) { 
    this.author = author; 
} 

public LocalDate getPublish_date() { 
    return publish_date; 
} 


public void setPublish_date(LocalDate publishDate) { 
    this.publish_date = publishDate; 
} 

public double getPrice() { 
    return price; 
} 

public void setPrice(double price) { 
    this.price = price; 
} 

public byte[] getContent() { 
    return content; 
} 

public void setContent(byte[] content) { 
    this.content = content; 
} 

public void setIsbn_13(String isbn) { 
    this.isbn_13 = isbn; 

} 

正如你所看到的,我沒有將數組列表(我拼寫這種方式來拼寫檢查)。但也許有一些東西我沒有得到,當試圖將其投入到這個實體。我使用的休眠版本是5.1.6(5.2有其問題)。

任何意見將不勝感激。

+0

DownloadBookServlet中的某行已關閉37行中的內容不是您發佈的代碼中的可執行行。猜測,getBookByISBN()會返回一個List ,但是您顯示的代碼並不是真正執行的代碼。重新檢查你的構建環境 - 你沒有使用你認爲你的類。 – stdunbar

+0

那麼,它會返回一個包含書中所有屬性的記錄。這在技術上是否被視爲一個列表?它不應該是一個對象嗎? –

回答

0

我解決了它。問題在於我如何使用Hibernate映射其他類。

相關問題