Skip to content

Commit a7d5cb6

Browse files
committed
add global exception handler
1 parent dfb5dc8 commit a7d5cb6

21 files changed

+568
-0
lines changed

Diff for: exception-handler-global/.gitignore

+82
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,82 @@
1+
/target
2+
/node_modules
3+
.gradle
4+
/build/
5+
/yarn-error.log
6+
7+
# Ignore Gradle GUI config
8+
gradle-app.setting
9+
10+
# Avoid ignoring Gradle wrapper jar file (.jar files are usually ignored)
11+
!gradle-wrapper.jar
12+
13+
# Cache of project
14+
.gradletasknamecache
15+
16+
# User-specific stuff:
17+
.idea/**/workspace.xml
18+
.idea/**/tasks.xml
19+
.idea/dictionaries
20+
.idea/artifacts
21+
22+
# Sensitive or high-churn files:
23+
.idea/**/dataSources/
24+
.idea/**/dataSources.ids
25+
.idea/**/dataSources.xml
26+
.idea/**/dataSources.local.xml
27+
.idea/**/sqlDataSources.xml
28+
.idea/**/dynamic.xml
29+
.idea/**/uiDesigner.xml
30+
31+
# Gradle:
32+
.idea/**/gradle.xml
33+
.idea/**/libraries
34+
35+
# CMake
36+
cmake-build-debug/
37+
38+
# Mongo Explorer plugin:
39+
.idea/**/mongoSettings.xml
40+
41+
## File-based project format:
42+
*.iws
43+
44+
## Plugin-specific files:
45+
46+
# IntelliJ
47+
/out/
48+
49+
# mpeltonen/sbt-idea plugin
50+
.idea_modules/
51+
52+
# JIRA plugin
53+
atlassian-ide-plugin.xml
54+
55+
# Cursive Clojure plugin
56+
.idea/replstate.xml
57+
58+
# Ruby plugin and RubyMine
59+
/.rakeTasks
60+
61+
# Crashlytics plugin (for Android Studio and IntelliJ)
62+
com_crashlytics_export_strings.xml
63+
crashlytics.properties
64+
crashlytics-build.properties
65+
fabric.properties
66+
67+
### JetBrains Patch ###
68+
# Comment Reason: https://github.com/joeblau/gitignore.io/issues/186#issuecomment-215987721
69+
70+
# *.iml
71+
# modules.xml
72+
.idea/misc.xml
73+
# *.ipr
74+
75+
# Sonarlint plugin
76+
.idea/sonarlint
77+
/.idea/.name
78+
/config.properties
79+
/src/main/webapp/manifest.json
80+
/src/main/resources/db.properties
81+
/src/test/resources/db-test.properties
82+
/.idea/hotswap_agent.xml

Diff for: exception-handler-global/.idea/compiler.xml

+24
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

Diff for: exception-handler-global/.idea/encodings.xml

+6
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

Diff for: exception-handler-global/.idea/modules.xml

+8
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

Diff for: exception-handler-global/.idea/vcs.xml

+6
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.
+91
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,91 @@
1+
<?xml version="1.0" encoding="UTF-8"?>
2+
<module org.jetbrains.idea.maven.project.MavenProjectsManager.isMavenModule="true" type="JAVA_MODULE" version="4">
3+
<component name="FacetManager">
4+
<facet type="Spring" name="Spring">
5+
<configuration />
6+
</facet>
7+
<facet type="web" name="Web">
8+
<configuration>
9+
<webroots />
10+
<sourceRoots>
11+
<root url="file://$MODULE_DIR$/src/main/java" />
12+
<root url="file://$MODULE_DIR$/src/main/resources" />
13+
</sourceRoots>
14+
</configuration>
15+
</facet>
16+
</component>
17+
<component name="NewModuleRootManager" LANGUAGE_LEVEL="JDK_1_8">
18+
<output url="file://$MODULE_DIR$/target/classes" />
19+
<output-test url="file://$MODULE_DIR$/target/test-classes" />
20+
<content url="file://$MODULE_DIR$">
21+
<sourceFolder url="file://$MODULE_DIR$/src/main/java" isTestSource="false" />
22+
<sourceFolder url="file://$MODULE_DIR$/src/main/resources" type="java-resource" />
23+
<sourceFolder url="file://$MODULE_DIR$/src/test/java" isTestSource="true" />
24+
<excludeFolder url="file://$MODULE_DIR$/target" />
25+
</content>
26+
<orderEntry type="inheritedJdk" />
27+
<orderEntry type="sourceFolder" forTests="false" />
28+
<orderEntry type="library" name="Maven: org.slf4j:slf4j-api:1.7.25" level="project" />
29+
<orderEntry type="library" name="Maven: org.springframework.boot:spring-boot-starter-web:2.0.3.RELEASE" level="project" />
30+
<orderEntry type="library" name="Maven: org.springframework.boot:spring-boot-starter:2.0.3.RELEASE" level="project" />
31+
<orderEntry type="library" name="Maven: org.springframework.boot:spring-boot-starter-logging:2.0.3.RELEASE" level="project" />
32+
<orderEntry type="library" name="Maven: ch.qos.logback:logback-classic:1.2.3" level="project" />
33+
<orderEntry type="library" name="Maven: ch.qos.logback:logback-core:1.2.3" level="project" />
34+
<orderEntry type="library" name="Maven: org.apache.logging.log4j:log4j-to-slf4j:2.10.0" level="project" />
35+
<orderEntry type="library" name="Maven: org.apache.logging.log4j:log4j-api:2.10.0" level="project" />
36+
<orderEntry type="library" name="Maven: org.slf4j:jul-to-slf4j:1.7.25" level="project" />
37+
<orderEntry type="library" name="Maven: javax.annotation:javax.annotation-api:1.3.2" level="project" />
38+
<orderEntry type="library" scope="RUNTIME" name="Maven: org.yaml:snakeyaml:1.19" level="project" />
39+
<orderEntry type="library" name="Maven: org.springframework.boot:spring-boot-starter-json:2.0.3.RELEASE" level="project" />
40+
<orderEntry type="library" name="Maven: com.fasterxml.jackson.core:jackson-databind:2.9.6" level="project" />
41+
<orderEntry type="library" name="Maven: com.fasterxml.jackson.core:jackson-annotations:2.9.0" level="project" />
42+
<orderEntry type="library" name="Maven: com.fasterxml.jackson.core:jackson-core:2.9.6" level="project" />
43+
<orderEntry type="library" name="Maven: com.fasterxml.jackson.datatype:jackson-datatype-jdk8:2.9.6" level="project" />
44+
<orderEntry type="library" name="Maven: com.fasterxml.jackson.datatype:jackson-datatype-jsr310:2.9.6" level="project" />
45+
<orderEntry type="library" name="Maven: com.fasterxml.jackson.module:jackson-module-parameter-names:2.9.6" level="project" />
46+
<orderEntry type="library" name="Maven: org.springframework.boot:spring-boot-starter-tomcat:2.0.3.RELEASE" level="project" />
47+
<orderEntry type="library" name="Maven: org.apache.tomcat.embed:tomcat-embed-core:8.5.31" level="project" />
48+
<orderEntry type="library" name="Maven: org.apache.tomcat.embed:tomcat-embed-el:8.5.31" level="project" />
49+
<orderEntry type="library" name="Maven: org.apache.tomcat.embed:tomcat-embed-websocket:8.5.31" level="project" />
50+
<orderEntry type="library" name="Maven: org.hibernate.validator:hibernate-validator:6.0.10.Final" level="project" />
51+
<orderEntry type="library" name="Maven: javax.validation:validation-api:2.0.1.Final" level="project" />
52+
<orderEntry type="library" name="Maven: org.jboss.logging:jboss-logging:3.3.2.Final" level="project" />
53+
<orderEntry type="library" name="Maven: com.fasterxml:classmate:1.3.4" level="project" />
54+
<orderEntry type="library" name="Maven: org.springframework:spring-web:5.0.7.RELEASE" level="project" />
55+
<orderEntry type="library" name="Maven: org.springframework:spring-beans:5.0.7.RELEASE" level="project" />
56+
<orderEntry type="library" name="Maven: org.springframework:spring-webmvc:5.0.7.RELEASE" level="project" />
57+
<orderEntry type="library" name="Maven: org.springframework:spring-aop:5.0.7.RELEASE" level="project" />
58+
<orderEntry type="library" name="Maven: org.springframework:spring-context:5.0.7.RELEASE" level="project" />
59+
<orderEntry type="library" name="Maven: org.springframework:spring-expression:5.0.7.RELEASE" level="project" />
60+
<orderEntry type="library" name="Maven: org.springframework.boot:spring-boot-starter-thymeleaf:2.0.3.RELEASE" level="project" />
61+
<orderEntry type="library" name="Maven: org.thymeleaf:thymeleaf-spring5:3.0.9.RELEASE" level="project" />
62+
<orderEntry type="library" name="Maven: org.thymeleaf:thymeleaf:3.0.9.RELEASE" level="project" />
63+
<orderEntry type="library" name="Maven: org.attoparser:attoparser:2.0.4.RELEASE" level="project" />
64+
<orderEntry type="library" name="Maven: org.unbescape:unbescape:1.1.5.RELEASE" level="project" />
65+
<orderEntry type="library" name="Maven: org.thymeleaf.extras:thymeleaf-extras-java8time:3.0.1.RELEASE" level="project" />
66+
<orderEntry type="library" name="Maven: org.springframework.boot:spring-boot-devtools:2.0.3.RELEASE" level="project" />
67+
<orderEntry type="library" name="Maven: org.springframework.boot:spring-boot:2.0.3.RELEASE" level="project" />
68+
<orderEntry type="library" name="Maven: org.springframework.boot:spring-boot-autoconfigure:2.0.3.RELEASE" level="project" />
69+
<orderEntry type="library" scope="TEST" name="Maven: org.springframework.boot:spring-boot-starter-test:2.0.3.RELEASE" level="project" />
70+
<orderEntry type="library" scope="TEST" name="Maven: org.springframework.boot:spring-boot-test:2.0.3.RELEASE" level="project" />
71+
<orderEntry type="library" scope="TEST" name="Maven: org.springframework.boot:spring-boot-test-autoconfigure:2.0.3.RELEASE" level="project" />
72+
<orderEntry type="library" scope="TEST" name="Maven: com.jayway.jsonpath:json-path:2.4.0" level="project" />
73+
<orderEntry type="library" scope="TEST" name="Maven: net.minidev:json-smart:2.3" level="project" />
74+
<orderEntry type="library" scope="TEST" name="Maven: net.minidev:accessors-smart:1.2" level="project" />
75+
<orderEntry type="library" scope="TEST" name="Maven: org.ow2.asm:asm:5.0.4" level="project" />
76+
<orderEntry type="library" scope="TEST" name="Maven: junit:junit:4.12" level="project" />
77+
<orderEntry type="library" scope="TEST" name="Maven: org.assertj:assertj-core:3.9.1" level="project" />
78+
<orderEntry type="library" scope="TEST" name="Maven: org.mockito:mockito-core:2.15.0" level="project" />
79+
<orderEntry type="library" scope="TEST" name="Maven: net.bytebuddy:byte-buddy:1.7.11" level="project" />
80+
<orderEntry type="library" scope="TEST" name="Maven: net.bytebuddy:byte-buddy-agent:1.7.11" level="project" />
81+
<orderEntry type="library" scope="TEST" name="Maven: org.objenesis:objenesis:2.6" level="project" />
82+
<orderEntry type="library" scope="TEST" name="Maven: org.hamcrest:hamcrest-core:1.3" level="project" />
83+
<orderEntry type="library" scope="TEST" name="Maven: org.hamcrest:hamcrest-library:1.3" level="project" />
84+
<orderEntry type="library" scope="TEST" name="Maven: org.skyscreamer:jsonassert:1.5.0" level="project" />
85+
<orderEntry type="library" scope="TEST" name="Maven: com.vaadin.external.google:android-json:0.0.20131108.vaadin1" level="project" />
86+
<orderEntry type="library" name="Maven: org.springframework:spring-core:5.0.7.RELEASE" level="project" />
87+
<orderEntry type="library" name="Maven: org.springframework:spring-jcl:5.0.7.RELEASE" level="project" />
88+
<orderEntry type="library" scope="TEST" name="Maven: org.springframework:spring-test:5.0.7.RELEASE" level="project" />
89+
<orderEntry type="library" scope="TEST" name="Maven: org.xmlunit:xmlunit-core:2.5.1" level="project" />
90+
</component>
91+
</module>

Diff for: exception-handler-global/pom.xml

+58
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,58 @@
1+
<?xml version="1.0" encoding="UTF-8"?>
2+
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
3+
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
4+
<modelVersion>4.0.0</modelVersion>
5+
6+
<groupId>org.springframework</groupId>
7+
<artifactId>exception-handler-global</artifactId>
8+
<version>0.1.0</version>
9+
10+
<parent>
11+
<groupId>org.springframework.boot</groupId>
12+
<artifactId>spring-boot-starter-parent</artifactId>
13+
<version>2.0.3.RELEASE</version>
14+
</parent>
15+
16+
<dependencies>
17+
<!-- https://mvnrepository.com/artifact/org.slf4j/slf4j-api -->
18+
<dependency>
19+
<groupId>org.slf4j</groupId>
20+
<artifactId>slf4j-api</artifactId>
21+
<version>1.7.25</version>
22+
</dependency>
23+
24+
<dependency>
25+
<groupId>org.springframework.boot</groupId>
26+
<artifactId>spring-boot-starter-web</artifactId>
27+
</dependency>
28+
<dependency>
29+
<groupId>org.springframework.boot</groupId>
30+
<artifactId>spring-boot-starter-thymeleaf</artifactId>
31+
</dependency>
32+
<dependency>
33+
<groupId>org.springframework.boot</groupId>
34+
<artifactId>spring-boot-devtools</artifactId>
35+
<optional>true</optional>
36+
</dependency>
37+
<dependency>
38+
<groupId>org.springframework.boot</groupId>
39+
<artifactId>spring-boot-starter-test</artifactId>
40+
<scope>test</scope>
41+
</dependency>
42+
</dependencies>
43+
44+
<properties>
45+
<java.version>1.8</java.version>
46+
</properties>
47+
48+
49+
<build>
50+
<plugins>
51+
<plugin>
52+
<groupId>org.springframework.boot</groupId>
53+
<artifactId>spring-boot-maven-plugin</artifactId>
54+
</plugin>
55+
</plugins>
56+
</build>
57+
58+
</project>

Diff for: exception-handler-global/readme.md

+7
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
# Exception handler
2+
3+
Handle exception with @ExceptionHandler in controller
4+
5+
Important! @ExceptionHandler - handle exception in current controller, if exception happened in other controller - not be handle
6+
7+
Go to route: "/" for see routes
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
package examples;
2+
3+
import org.springframework.boot.SpringApplication;
4+
import org.springframework.boot.autoconfigure.SpringBootApplication;
5+
6+
@SpringBootApplication
7+
public class Application {
8+
public static void main(String[] args) {
9+
SpringApplication.run(Application.class, args);
10+
}
11+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,53 @@
1+
package examples.controller;
2+
3+
import examples.exception.*;
4+
import org.slf4j.LoggerFactory;
5+
import org.springframework.http.HttpStatus;
6+
import org.springframework.stereotype.Controller;
7+
import org.springframework.web.bind.annotation.ExceptionHandler;
8+
import org.springframework.web.bind.annotation.RequestMapping;
9+
import org.springframework.web.bind.annotation.ResponseStatus;
10+
11+
@Controller
12+
public class ExceptionHandlingController {
13+
private static final org.slf4j.Logger logger = LoggerFactory.getLogger(ExceptionHandlingController.class);
14+
15+
// Unchecked exception
16+
@RequestMapping("/some-exception-unchecked")
17+
public void throwSomeRuntimeException() {
18+
throw new SomeRuntimeException("some runtime exception");
19+
}
20+
21+
// local handle exception in this controller - do nothing
22+
// handle exception SomeRuntimeException - only logging and ignore - nothing show
23+
@ExceptionHandler(SomeRuntimeException.class)
24+
public void handleSomeRuntimeException(Exception ex) {
25+
logger.error(ex.getMessage());
26+
}
27+
28+
29+
// Checked exception
30+
@RequestMapping("/some-exception-checked")
31+
public void throwCheckedException() throws CheckedException {
32+
throw new CheckedException("some exception checked");
33+
}
34+
35+
// Unchecked exception
36+
// this OtherRuntimeException annotated by ResponseStatus
37+
@RequestMapping("/other-exception-unchecked-with-status")
38+
public void throwOtherRuntimeException() {
39+
throw new OtherRuntimeException("other exception");
40+
}
41+
42+
// Unchecked exception
43+
@RequestMapping("/exception-custom-page")
44+
public void throwOtherOtherRuntimeException() {
45+
throw new OtherOtherRuntimeException("other other exception");
46+
}
47+
48+
// Unchecked exception
49+
@RequestMapping("/exception-custom-page-response-entity")
50+
public void throwInfoRuntimeException() {
51+
throw new InfoRuntimeException("info exception");
52+
}
53+
}

0 commit comments

Comments
 (0)