Lỗi Etat HTTP 500 – Error instantiating servlet class – Lỗi khởi tạo class servlet

Chào các tín đồ Java. Bài viết “Lỗi Etat HTTP 500 - Error instantiating servlet class - Lỗi khởi tạo class servlet” là bài viết thứ hai nằm trong loạt bài “Tổng hợp lỗi Server Tomcat thường gặp và cách khắc phục” tại blog. Trước đó mình đã giới thiệu về một lỗi anh em với 500 là 404. Bạn có thể xem thêm bài đó: Thông báo lỗi Etat HTTP 404 trong Java Web – Chuyện gì đang xảy ra.

Lỗi Etat HTTP 500 - Error instantiating servlet class - Lỗi khởi tạo class servlet

500 là lỗi gì?

Trước tiên, chúng ta cần biết 500 là mã lỗi gì, khác như thế nào với 404 nhé. 404 là lỗi không tìm thấy, không phải lỗi hoàn toàn của server, vậy 500 là lỗi hoàn toàn do server. Khi server bị lỗi gì đó (cũng do thằng lập trình viên code sai thôi) thì lập tức mã lỗi 500 sẽ trả về cho người dùng. Mà cụ thể trong Java Web sẽ là Etat HTTP 500.

Lỗi server (Etat HTTP 500) thì có rất rất nhiều loại. Do đó, trong bài này mình chỉ giới thiệu qua lỗi Error instantiating servlet class và cách khắc phục. Những lỗi server Etat HTTP 500 khác mình sẽ giới thiệu trong những bài viết khác nữa (mỗi lỗi một bài).

Etat HTTP 500 – Error instantiating servlet class…

Mình có một số thông tin mẫu về lỗi hiện trên trình duyệt như sau: (có thể xem hình trên)

Etat HTTP 500 - Error instantiating servlet class ADuController

type Rapport d''exception

message Error instantiating servlet class ADuController

description Le serveur a rencontré une erreur interne qui l''a empêché de satisfaire la requête.

exception

javax.servlet.ServletException: Error instantiating servlet class ADuController
	org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:505)
	org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:103)
	org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:957)
	org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:423)
	org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1079)
	org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:620)
	org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:318)
	java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source)
	java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source)
	org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)
	java.lang.Thread.run(Unknown Source)
cause mère

java.lang.ClassNotFoundException: ADuController
	org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1722)
	org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1573)
	org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:505)
	org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:103)
	org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:957)
	org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:423)
	org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1079)
	org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:620)
	org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:318)
	java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source)
	java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source)
	org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)
	java.lang.Thread.run(Unknown Source)
note La trace complète de la cause mère de cette erreur est disponible dans les fichiers journaux de Apache Tomcat/7.0.63.

Giới thiệu một chút thông tin:

  • Server Tomcat mình đang dùng: Apache Tomcat verion 7.0.63
  • Mình đang truy cập vào địa chỉ (url pattern): “\a-du” thì bị lỗi.

Cách khắc phục lỗi Error instantiating servlet class…

Để sửa được lỗi này, bạn phải đọc thông báo lỗi mà server trả về. Lỗi này khá đơn giản nên chỉ cần nhìn lỗi trên trình duyệt thì có thể sửa được ngay. Nhưng đối với các lỗi phức tạp hơn, mình khuyên các bạn nên nhìn vào thông báo lỗi hiện ở console của IDE (Eclipse chẳng hạn) nữa nhé.

Đây là thông báo lỗi hiện ở console (có vẻ giống với những gì trình duyệt hiển thị)

java.lang.ClassNotFoundException: ADuController
	at org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1722)
	at org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1573)
	at org.apache.catalina.core.DefaultInstanceManager.loadClass(DefaultInstanceManager.java:506)
	at org.apache.catalina.core.DefaultInstanceManager.loadClassMaybePrivileged(DefaultInstanceManager.java:488)
	at org.apache.catalina.core.DefaultInstanceManager.newInstance(DefaultInstanceManager.java:115)
	at org.apache.catalina.core.StandardWrapper.loadServlet(StandardWrapper.java:1148)
	at org.apache.catalina.core.StandardWrapper.allocate(StandardWrapper.java:864)
	at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:134)
	at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:122)
	at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:505)
	at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:170)
	at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:103)
	at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:957)
	at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:116)
	at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:423)
	at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1079)
	at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:620)
	at org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:318)
	at java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source)
	at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source)
	at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)
	at java.lang.Thread.run(Unknown Source)

Phân tích lỗi

Bạn có thấy thông báo: Error instantiating servlet class ADuController: Đây là lỗi khi khởi tạo class servlet, mà cụ thể ở đây là class ADuController (Á đù 😀 ). Có thể servlet với tên này chưa tồn tại.

Tiếp tục nhìn xuống dưới tý (dưới đoạn thông báo trên chứ không phải dưới rốn nhé 😀 ) hoặc nhìn vào console: Có dòng java.lang.ClassNotFoundException: ADuController – Đây mới là mấu chốt của vấn đề, có thể chỉ nhìn vào dòng này là biết được lỗi gì rồi. Một Exception từ ClassNotFoundException thì chỉ có thể là không tìm thấy class có tên ADuController.

Khắc phục thôi

Như vậy, chúng ta đã xác định được nguyên nhân lỗi là không tìm thấy class ADuController:

  • Có khả năng bạn chưa tạo ra class ADuController trong project (chưa tạo thì tạo đi nhé).
  • Nếu đã tạo rồi thì có thể do server chưa build kịp servlet đó ra class. Thử restart lại server Tomcat, hoặc clean project, clean Tomcat nhé (Chưa biết cách clean thì xem lại bài lỗi 404, mình có hướng dẫn ở bài đó)
  • Một trường hợp nữa, có khả năng xảy ra như sau: Bạn không biết ADuController từ đâu xuất hiện, bạn chưa bao giờ có ý định tạo ra servlet đó. Vậy thì xem lại phần cấu hình file web.xml, tương ứng với url pattern (<url-pattern>/a-du</url-pattern>) đang truy cập sẽ được mapping với một servlet (ví dụ: <servlet-class>ADuController</servlet-class>). Có thể class bạn muốn mapping với url kia là AhihiADuController chứ không phải là ADuController.

Xong! Kết thúc bài viết tại đây. Nếu có thắc mắc hay cần góp ý gì thì để lại comment cho mình bên dưới bạn nhé 😀

0 0 votes
Đánh giá bài viết
Nhận thông báo
Thông báo khi có
guest

6 Bình luận
cũ nhất
mới nhất vote nhiều nhất
Phản hồi nội tuyến
Xem tất cả các bình luận
tuyendev

được của nó anh ei, hi vọng anh ném thêm nhiều cái lỗi và cách khắc phục nữa vào mặt bọn coder cho nó sáng mắt thông não.

Kiều

Hic mình bị ý vậy nhưng check lại thì không phải thiếu hay sai tên Servlet-name. Mình rồi bời luôn

Kiều

package sourceCode;

import java.io.IOException;
import java.io.PrintWriter;

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

public class demo extends HttpServlet{
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
resp.setContentType(“text/html”);
PrintWriter printWriter = resp.getWriter();
printWriter.println(“<h1>Hello World</h1>”);

printWriter.close();
}
}

<?xml version=”1.0″ encoding=”UTF-8″?>
<web-app xmlns:xsi=”http://www.w3.org/2001/XMLSchema-instance” xmlns=”http://xmlns.jcp.org/xml/ns/javaee” xsi:schemaLocation=”http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd” id=”WebApp_ID” version=”3.1″>
 <display-name>test</display-name>
 <welcome-file-list>
  <welcome-file>index.html</welcome-file>
  <welcome-file>index.htm</welcome-file>
  <welcome-file>index.jsp</welcome-file>
  <welcome-file>default.html</welcome-file>
  <welcome-file>default.htm</welcome-file>
  <welcome-file>default.jsp</welcome-file>
 </welcome-file-list>
 <servlet>
  <servlet-name>demo</servlet-name>
  <servlet-class>sourceCode.demo</servlet-class>
 </servlet>
 <servlet-mapping>
  <servlet-name>demo</servlet-name>
  <url-pattern>/home</url-pattern>
 </servlet-mapping>
</web-app>

Kiều

Mình giữ Ctrl + click vào địa chỉ của servlet-class thành công mở ra file tương ứng ạ!
Trước đây em không bị trường hợp này ạ. Em dùng tomcat 8.5 ạ!

Kiều

MÌnh thử đủ mọi cách, sau đó mình xoá file MANIFEST.MF thì lại chạy được :v