Skip to content

Commit 1dd0369

Browse files
committed
add exception handler
1 parent 302e848 commit 1dd0369

File tree

4 files changed

+70
-35
lines changed

4 files changed

+70
-35
lines changed

pom.xml

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,9 +2,9 @@
22
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
33
<modelVersion>4.0.0</modelVersion>
44

5-
<groupId>com.kodgemisi</groupId>
5+
<groupId>com.github.kodgemisi</groupId>
66
<artifactId>servlet-url-mapper</artifactId>
7-
<version>1.0.1</version>
7+
<version>1.1.0</version>
88
<packaging>jar</packaging>
99

1010
<organization>
Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
package com.kodgemisi.servlet_url_mapping;
2+
3+
import javax.servlet.http.HttpServletRequest;
4+
import javax.servlet.http.HttpServletResponse;
5+
6+
/**
7+
* Handles any exception during doXXX methods of {@link MappingServlet}. {@link MappingServlet} uses
8+
* {@link LoggingExceptionHandler} as default implementation.
9+
*
10+
* @see LoggingExceptionHandler
11+
*/
12+
@FunctionalInterface
13+
public interface ExceptionHandler {
14+
15+
void handleException(HttpServletRequest request, HttpServletResponse response, Exception e);
16+
17+
}
Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
package com.kodgemisi.servlet_url_mapping;
2+
3+
import org.slf4j.Logger;
4+
import org.slf4j.LoggerFactory;
5+
6+
import javax.servlet.http.HttpServletRequest;
7+
import javax.servlet.http.HttpServletResponse;
8+
9+
/**
10+
* Logs and rethrows any uncaught exception wrapped in a RuntimeException.
11+
*/
12+
public class LoggingExceptionHandler implements ExceptionHandler {
13+
14+
private static final Logger log = LoggerFactory.getLogger(LoggingExceptionHandler.class);
15+
16+
@Override
17+
public void handleException(HttpServletRequest request, HttpServletResponse response, Exception e) {
18+
log.error(e.getMessage(), e);
19+
throw new RuntimeException(e);
20+
}
21+
}

src/main/java/com/kodgemisi/servlet_url_mapping/MappingServlet.java

Lines changed: 30 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -64,6 +64,11 @@ public class MappingServlet extends HttpServlet {
6464
*/
6565
protected final ServletUrlPatternRegistrar urlMappingRegistrar;
6666

67+
/**
68+
* Default is {@link LoggingExceptionHandler}
69+
*/
70+
protected final ExceptionHandler exceptionHandler;
71+
6772
public MappingServlet() {
6873
this(true);
6974
}
@@ -75,70 +80,62 @@ public MappingServlet() {
7580
* <a href="http://docs.spring.io/spring/docs/5.0.x/javadoc-api/org/springframework/web/servlet/mvc/method/annotation/RequestMappingHandlerMapping.html#setUseTrailingSlashMatch-boolean-">Spring API</a>
7681
*/
7782
public MappingServlet(boolean useTrailingSlashMatch) {
83+
this(new LoggingExceptionHandler(), useTrailingSlashMatch);
84+
}
85+
86+
public MappingServlet(ExceptionHandler exceptionHandler, boolean useTrailingSlashMatch) {
7887
this.urlMappingRegistrar = new ServletUrlPatternRegistrar(useTrailingSlashMatch);
88+
this.exceptionHandler = exceptionHandler;
7989
}
8090

8191
@Override
8292
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
83-
final ServletUrl servletUrl = urlMappingRegistrar.handle(request, response);
84-
85-
if (servletUrl.is404()) {
86-
response.sendError(HttpServletResponse.SC_NOT_FOUND);
87-
}
93+
doCommon(request, response);
8894
}
8995

9096
@Override
9197
protected void doHead(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
92-
final ServletUrl servletUrl = urlMappingRegistrar.handle(request, response);
93-
94-
if (servletUrl.is404()) {
95-
response.sendError(HttpServletResponse.SC_NOT_FOUND);
96-
}
98+
doCommon(request, response);
9799
}
98100

99101
@Override
100102
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
101-
final ServletUrl servletUrl = urlMappingRegistrar.handle(request, response);
102-
103-
if (servletUrl.is404()) {
104-
response.sendError(HttpServletResponse.SC_NOT_FOUND);
105-
}
103+
doCommon(request, response);
106104
}
107105

108106
@Override
109107
protected void doPut(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
110-
final ServletUrl servletUrl = urlMappingRegistrar.handle(request, response);
111-
112-
if (servletUrl.is404()) {
113-
response.sendError(HttpServletResponse.SC_NOT_FOUND);
114-
}
108+
doCommon(request, response);
115109
}
116110

117111
@Override
118112
protected void doDelete(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
119-
final ServletUrl servletUrl = urlMappingRegistrar.handle(request, response);
120-
121-
if (servletUrl.is404()) {
122-
response.sendError(HttpServletResponse.SC_NOT_FOUND);
123-
}
113+
doCommon(request, response);
124114
}
125115

126116
@Override
127117
protected void doOptions(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
128-
final ServletUrl servletUrl = urlMappingRegistrar.handle(request, response);
129-
130-
if (servletUrl.is404()) {
131-
response.sendError(HttpServletResponse.SC_NOT_FOUND);
132-
}
118+
doCommon(request, response);
133119
}
134120

135121
@Override
136122
protected void doTrace(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
137-
final ServletUrl servletUrl = urlMappingRegistrar.handle(request, response);
123+
doCommon(request, response);
124+
}
125+
126+
private void doCommon(HttpServletRequest request, HttpServletResponse response) {
127+
final ServletUrl servletUrl;
128+
try {
129+
servletUrl = urlMappingRegistrar.handle(request, response);
138130

139-
if (servletUrl.is404()) {
140-
response.sendError(HttpServletResponse.SC_NOT_FOUND);
131+
if (servletUrl.is404()) {
132+
response.sendError(HttpServletResponse.SC_NOT_FOUND);
133+
}
141134
}
135+
catch (Exception e) {
136+
this.exceptionHandler.handleException(request, response, e);
137+
}
138+
142139
}
143140

144141
}

0 commit comments

Comments
 (0)