Spring MVC – 16 – Exception Handling – 02 | Controller Based | Global Exception Handling

Merhaba Arkadaslar
Bu bolumde Spring Exception Handling konusuna devam edecegiz.

Controller Based Exception Handling

@ExceptionHandler annotation yardimi ile exception handling yapacak metotlarimizi tanimlayabiliriz.
Controller tarafindan karsilanan bir istek sonrasi exception firlatildigi durumda bu metotlar tarafindan surec devam ettirilecektir.

ExceptionHandlingController.java
Controller sinifimizi inceleyim , throwSQLException ve throwIndexOutOfBoundsException metotlarini istek/requestleri karsilamak icin kullaniyoruz ve test amacli SQLException ve IndexOutOfBoundsException firlatiyoruz.

handleSQLException ve handleIndexOutOfBoundsException metotlarinda @ExceptionHandler annotation’ini kullaniyoruz. Request bu Controller tarafindan karsilandiginda ve ilgili exceptionlar ortaya ciktigi durumda @ExceptionHandler annotation’i ile bildirdigimiz metotlar hata sonrasinda devreye girecektir.
Dikkat edecek olursak { } arasinda birden fazla exception turu de belirtebiliyoruz.
Basit olarak String deger ile sadece exception sonrasi gosterecegimiz jsp sayfasini gosterebiliriz ya da ModelAndView objesi kullanarak view , model duzenlemesi yapabiliriz.

package _15.exception.handling.annotationBased.controller;

import java.sql.SQLDataException;
import java.sql.SQLException;
import javax.servlet.http.HttpServletRequest;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.servlet.ModelAndView;

@Controller
public class ExceptionHandlingController {

	@RequestMapping("/sqlException")
	//http://localhost:8080/injavawetrust.springmvc/sqlException
	String throwSQLException() throws SQLException {
		System.out.println("SQLException....");
		throw new SQLException();
	}

	@RequestMapping("/indexOutOfBoundsException")
	//http://localhost:8080/injavawetrust.springmvc/inadexOutOfBoundsException
	String throwIndexOutOfBoundsException() {
		System.out.println("IndexOutOfBoundsException....");
		throw new IndexOutOfBoundsException();
	}

	@ExceptionHandler({SQLException.class, SQLDataException.class})
	public String handleSQLException() {
		return "15.exception.handling.annotationBased.view/sqlException";
	}

	@ExceptionHandler({IndexOutOfBoundsException.class})
	public ModelAndView handleIndexOutOfBoundsException(HttpServletRequest req, Exception exception) {

		ModelAndView modelAndView = new ModelAndView();
		modelAndView.addObject("exception", exception);
		modelAndView.setViewName("15.exception.handling.annotationBased.view/indexOutOfBoundsException");
		return modelAndView;
	}
}

Jsp dosyalarimizin icerigi onceki bolumde oldugu gibi basit olacak ;

sqlException.jsp

<html>
<body>
 <h2>sqlException.jsp</h2>
 <h2>Check your query...</h2>
</body>
</html>

indexOutOfBoundsException.jsp

<html>
<body>
 <h2>indexOutOfBoundsException.jsp</h2>
 <h2>${exception}</h2>
</body>
</html>

Ornegimizi test edelim ;

http://localhost:8080/injavawetrust.springmvc/sqlException

sqlexception

http://localhost:8080/injavawetrust.springmvc/indexOutOfBoundsException

indexoutofboundsexception

Global Exception Handling

Controlled Based Exception Handling yaklasiminda sadece ilgili Controller da ortaya cikan exceptionlar yakalanacaktir. Bununla birlikte her Controller icin bu tanimi tek tek yapmak yerine daha genel bir cozum yapabiliriz.

Oncelikle yeni bir Controller tanimlayalim ve ilk ornegimizde oldugu gibi SQLException ve IndexOutOfBoundsException firlatsin ( throw)

ExceptionHandlingController2.java

package _15.exception.handling.annotationBased.controller;

import java.sql.SQLException;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;

@Controller
public class ExceptionHandlingController2 {

	@RequestMapping("/sqlException2")
	//http://localhost:8080/injavawetrust.springmvc/sqlException2
	String throwSQLException() throws SQLException {
		System.out.println("SQLException 2....");
		throw new SQLException();
	}

	@RequestMapping("/indexOutOfBoundsException2")
	//http://localhost:8080/injavawetrust.springmvc/indexOutOfBoundsException2
	String throwIndexOutOfBoundsException() {
		System.out.println("IndexOutOfBoundsException 2....");
		throw new IndexOutOfBoundsException();
	}

}

Ornegimizi test edelim , /sqlException2 URL adresine gittigimizde ilgili throwSQLException metodu calisacak ve bu Controller bunyesinde @ExceptionHandler ile ilgili exceptioni yakalamadigimiz icin ;

http://localhost:8080/injavawetrust.springmvc/sqlException2

sqlexception2

Tabi ayni durum ilgili URL icin de gecerli olacak ;

http://localhost:8080/injavawetrust.springmvc/indexOutOfBoundsException2

Simdi de Global Exception Handling icin bir sinif tanimlayalim , burada @Controller yerine @ControllerAdvice annotation’ini kullanacagiz. Yine ilgili exceptionlari tanimlamak icin @ExceptionHandler annotation’ini kullaniyoruz.
Boylece tum proje kapsaminda ilgili exceptionlar firlatildiginda bu metotlar tarafindan handle edilecektir.
Yine dikkat edecek olursak ilgili hatalari test edebilmek icin farkli jsp dosyalarini view olarak kullaniyoruz , tabi icerigi yine basit sekilde olacak.

GlobalExceptionHandlingController.java

package _15.exception.handling.annotationBased.controller;

import java.sql.SQLDataException;
import java.sql.SQLException;

import javax.servlet.http.HttpServletRequest;

import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.servlet.ModelAndView;

@ControllerAdvice
public class GlobalExceptionHandlingController {

	@ExceptionHandler({SQLException.class, SQLDataException.class})
	public String handleGenericSQLException() {
		System.out.println("handleGenericSQLException...");
		return "15.exception.handling.annotationBased.view/genericSqlException";
	}

	@ExceptionHandler({IndexOutOfBoundsException.class})
	public ModelAndView handleGenericIndexOutOfBoundsException(HttpServletRequest req, Exception exception) {
		System.out.println("handleGenericIndexOutOfBoundsException...");
		ModelAndView modelAndView = new ModelAndView();
		modelAndView.addObject("exception", exception);
		modelAndView.setViewName("15.exception.handling.annotationBased.view/genericIndexOutOfBoundsException");
		return modelAndView;
	}

	// Eger SimpleMappingExceptionResolver da kullanilmissa @ExceptionHandler
	// oncelikli olacaktir.
	// SimpleMappingExceptionResolver icin NullPointerException hatasi sonucu donecek
	// jsp dosyasini belirtmistik.
	// Ayni testi tekrar yaptigimizda genericNpe.jsp calisacaktir.
	//	 @ExceptionHandler({NullPointerException.class})
	//	 public String handleNullPointerException() {
	//		 return "15.exception.handling.annotationBased.view/genericNpe";
	//	 }

}

genericSqlException.jsp

<html>
<body>
 <h2>genericSqlException.jsp</h2>
 <h2>Generic SQLException...</h2>
</body>
</html>

genericIndexOutOfBoundsException.jsp

<html>
<body>
 <h2>genericIndexOutOfBoundsException.jsp</h2>
 <h2>${exception}</h2>
</body>
</html>

Uygulamamizi tekrar test edelim ;

http://localhost:8080/injavawetrust.springmvc/sqlException2

sqlexception3

http://localhost:8080/injavawetrust.springmvc/indexOutOfBoundsException2

indexoutofboundsexception2

Eger SimpleMappingExceptionResolver da kullanilmissa @ExceptionHandler oncelikli olacaktir.SimpleMappingExceptionResolver icin NullPointerException hatasi sonucu donecek jsp dosyasini belirtmistik. Ayni testi tekrar yaptigimizda genericNpe.jsp calisacaktir.

http://localhost:8080/injavawetrust.springmvc/nullPointerException

genericNpe

genericNpe.jsp

<html>
<body>
 <h2>genericNpe.jsp</h2>
</body>
</html>

Github kaynak kodlar / source folder
Injavawetrust-springmvc-tutorial

Yazimi burada sonlandiriyorum.
Herkese Bol Javali Gunler dilerim.
Be an oracle man , import java.*;
Levent Erguder
OCP, Java SE 6 Programmer
OCE, Java EE 6 Web Component Developer

Print Friendly, PDF & Email

Leave a Reply

Your email address will not be published. Required fields are marked *