Skip to content

Commit 7fa2aba

Browse files
faabianrmaibin
authored andcommitted
BAEL-2414 Guide to problem-spring-web (eugenp#6147)
* Fix issue with package name and folder name mismatch * Add problem-spring-web code samples * Use the latest version of the problem-spring-web library. Add spring security exceptions handling samples * Fix issue with security configuration. Fix sample for forbidden operation * Update ProblemDemoConfiguration.java * Add integration tests to validate problems are correctly handled and responses are generated using the problem library
1 parent 36eac84 commit 7fa2aba

File tree

12 files changed

+409
-130
lines changed

12 files changed

+409
-130
lines changed

spring-boot-libraries/pom.xml

Lines changed: 141 additions & 129 deletions
Original file line numberDiff line numberDiff line change
@@ -1,144 +1,156 @@
11
<project xmlns="http://maven.apache.org/POM/4.0.0"
2-
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-
<artifactId>spring-boot-libraries</artifactId>
6-
<packaging>war</packaging>
7-
<name>spring-boot-libraries</name>
8-
<description>This is simple boot application for Spring boot actuator test</description>
2+
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+
<artifactId>spring-boot-libraries</artifactId>
6+
<packaging>war</packaging>
7+
<name>spring-boot-libraries</name>
8+
<description>This is simple boot application for Spring boot actuator test</description>
99

10-
<parent>
11-
<artifactId>parent-boot-2</artifactId>
12-
<groupId>com.baeldung</groupId>
13-
<version>0.0.1-SNAPSHOT</version>
14-
<relativePath>../parent-boot-2</relativePath>
15-
</parent>
10+
<parent>
11+
<artifactId>parent-boot-2</artifactId>
12+
<groupId>com.baeldung</groupId>
13+
<version>0.0.1-SNAPSHOT</version>
14+
<relativePath>../parent-boot-2</relativePath>
15+
</parent>
1616

17-
<dependencies>
18-
<dependency>
19-
<groupId>org.springframework.boot</groupId>
20-
<artifactId>spring-boot-starter-web</artifactId>
21-
</dependency>
22-
<dependency>
23-
<groupId>org.springframework.boot</groupId>
24-
<artifactId>spring-boot-starter-tomcat</artifactId>
25-
</dependency>
26-
<dependency>
27-
<groupId>org.springframework.boot</groupId>
28-
<artifactId>spring-boot-starter-test</artifactId>
29-
<scope>test</scope>
30-
</dependency>
17+
<dependencies>
18+
<dependency>
19+
<groupId>org.springframework.boot</groupId>
20+
<artifactId>spring-boot-starter-web</artifactId>
21+
</dependency>
22+
<dependency>
23+
<groupId>org.springframework.boot</groupId>
24+
<artifactId>spring-boot-starter-security</artifactId>
25+
</dependency>
26+
<dependency>
27+
<groupId>org.springframework.boot</groupId>
28+
<artifactId>spring-boot-starter-tomcat</artifactId>
29+
</dependency>
30+
<dependency>
31+
<groupId>org.springframework.boot</groupId>
32+
<artifactId>spring-boot-starter-test</artifactId>
33+
<scope>test</scope>
34+
</dependency>
35+
36+
<!-- Problem Spring Web -->
37+
<dependency>
38+
<groupId>org.zalando</groupId>
39+
<artifactId>problem-spring-web</artifactId>
40+
<version>${problem-spring-web.version}</version>
41+
</dependency>
3142

32-
<!-- ShedLock -->
33-
<dependency>
34-
<groupId>net.javacrumbs.shedlock</groupId>
35-
<artifactId>shedlock-spring</artifactId>
36-
<version>2.1.0</version>
37-
</dependency>
38-
<dependency>
39-
<groupId>net.javacrumbs.shedlock</groupId>
40-
<artifactId>shedlock-provider-jdbc-template</artifactId>
41-
<version>2.1.0</version>
42-
</dependency>
43+
<!-- ShedLock -->
44+
<dependency>
45+
<groupId>net.javacrumbs.shedlock</groupId>
46+
<artifactId>shedlock-spring</artifactId>
47+
<version>2.1.0</version>
48+
</dependency>
49+
<dependency>
50+
<groupId>net.javacrumbs.shedlock</groupId>
51+
<artifactId>shedlock-provider-jdbc-template</artifactId>
52+
<version>2.1.0</version>
53+
</dependency>
4354

44-
</dependencies>
55+
</dependencies>
4556

46-
<build>
47-
<finalName>spring-boot</finalName>
48-
<resources>
49-
<resource>
50-
<directory>src/main/resources</directory>
51-
<filtering>true</filtering>
52-
</resource>
53-
</resources>
57+
<build>
58+
<finalName>spring-boot</finalName>
59+
<resources>
60+
<resource>
61+
<directory>src/main/resources</directory>
62+
<filtering>true</filtering>
63+
</resource>
64+
</resources>
5465

55-
<plugins>
66+
<plugins>
5667

57-
<plugin>
58-
<groupId>org.apache.maven.plugins</groupId>
59-
<artifactId>maven-war-plugin</artifactId>
60-
</plugin>
68+
<plugin>
69+
<groupId>org.apache.maven.plugins</groupId>
70+
<artifactId>maven-war-plugin</artifactId>
71+
</plugin>
6172

62-
<plugin>
63-
<groupId>pl.project13.maven</groupId>
64-
<artifactId>git-commit-id-plugin</artifactId>
65-
<version>${git-commit-id-plugin.version}</version>
66-
<executions>
67-
<execution>
68-
<id>get-the-git-infos</id>
69-
<goals>
70-
<goal>revision</goal>
71-
</goals>
72-
<phase>initialize</phase>
73-
</execution>
74-
<execution>
75-
<id>validate-the-git-infos</id>
76-
<goals>
77-
<goal>validateRevision</goal>
78-
</goals>
79-
<phase>package</phase>
80-
</execution>
81-
</executions>
82-
<configuration>
83-
<generateGitPropertiesFile>true</generateGitPropertiesFile>
84-
<generateGitPropertiesFilename>${project.build.outputDirectory}/git.properties</generateGitPropertiesFilename>
85-
</configuration>
86-
</plugin>
73+
<plugin>
74+
<groupId>pl.project13.maven</groupId>
75+
<artifactId>git-commit-id-plugin</artifactId>
76+
<version>${git-commit-id-plugin.version}</version>
77+
<executions>
78+
<execution>
79+
<id>get-the-git-infos</id>
80+
<goals>
81+
<goal>revision</goal>
82+
</goals>
83+
<phase>initialize</phase>
84+
</execution>
85+
<execution>
86+
<id>validate-the-git-infos</id>
87+
<goals>
88+
<goal>validateRevision</goal>
89+
</goals>
90+
<phase>package</phase>
91+
</execution>
92+
</executions>
93+
<configuration>
94+
<generateGitPropertiesFile>true</generateGitPropertiesFile>
95+
<generateGitPropertiesFilename>${project.build.outputDirectory}/git.properties</generateGitPropertiesFilename>
96+
</configuration>
97+
</plugin>
8798

88-
</plugins>
99+
</plugins>
89100

90-
</build>
101+
</build>
91102

92-
<profiles>
93-
<profile>
94-
<id>autoconfiguration</id>
95-
<build>
96-
<plugins>
97-
<plugin>
98-
<groupId>org.apache.maven.plugins</groupId>
99-
<artifactId>maven-surefire-plugin</artifactId>
100-
<executions>
101-
<execution>
102-
<phase>integration-test</phase>
103-
<goals>
104-
<goal>test</goal>
105-
</goals>
106-
<configuration>
107-
<excludes>
108-
<exclude>**/*LiveTest.java</exclude>
109-
<exclude>**/*IntegrationTest.java</exclude>
110-
<exclude>**/*IntTest.java</exclude>
111-
</excludes>
112-
<includes>
113-
<include>**/AutoconfigurationTest.java</include>
114-
</includes>
115-
</configuration>
116-
</execution>
117-
</executions>
118-
<configuration>
119-
<systemPropertyVariables>
120-
<test.mime>json</test.mime>
121-
</systemPropertyVariables>
122-
</configuration>
123-
</plugin>
124-
</plugins>
125-
</build>
126-
</profile>
127-
</profiles>
103+
<profiles>
104+
<profile>
105+
<id>autoconfiguration</id>
106+
<build>
107+
<plugins>
108+
<plugin>
109+
<groupId>org.apache.maven.plugins</groupId>
110+
<artifactId>maven-surefire-plugin</artifactId>
111+
<executions>
112+
<execution>
113+
<phase>integration-test</phase>
114+
<goals>
115+
<goal>test</goal>
116+
</goals>
117+
<configuration>
118+
<excludes>
119+
<exclude>**/*LiveTest.java</exclude>
120+
<exclude>**/*IntegrationTest.java</exclude>
121+
<exclude>**/*IntTest.java</exclude>
122+
</excludes>
123+
<includes>
124+
<include>**/AutoconfigurationTest.java</include>
125+
</includes>
126+
</configuration>
127+
</execution>
128+
</executions>
129+
<configuration>
130+
<systemPropertyVariables>
131+
<test.mime>json</test.mime>
132+
</systemPropertyVariables>
133+
</configuration>
134+
</plugin>
135+
</plugins>
136+
</build>
137+
</profile>
138+
</profiles>
128139

129-
<properties>
130-
<!-- The main class to start by executing java -jar -->
131-
<start-class>com.baeldung.intro.App</start-class>
132-
<tomee-servlet-api.version>8.5.11</tomee-servlet-api.version>
133-
<togglz.version>2.4.1.Final</togglz.version>
134-
<rome.version>1.9.0</rome.version>
135-
<chaos.monkey.version>2.0.0</chaos.monkey.version>
136-
<graphql-spring-boot-starter.version>5.0.2</graphql-spring-boot-starter.version>
137-
<graphiql-spring-boot-starter.version>5.0.2</graphiql-spring-boot-starter.version>
138-
<graphql-java-tools.version>5.2.4</graphql-java-tools.version>
139-
<guava.version>18.0</guava.version>
140-
<git-commit-id-plugin.version>2.2.4</git-commit-id-plugin.version>
141-
<modelmapper.version>2.3.2</modelmapper.version>
142-
</properties>
140+
<properties>
141+
<!-- The main class to start by executing java -jar -->
142+
<start-class>com.baeldung.intro.App</start-class>
143+
<tomee-servlet-api.version>8.5.11</tomee-servlet-api.version>
144+
<togglz.version>2.4.1.Final</togglz.version>
145+
<rome.version>1.9.0</rome.version>
146+
<chaos.monkey.version>2.0.0</chaos.monkey.version>
147+
<graphql-spring-boot-starter.version>5.0.2</graphql-spring-boot-starter.version>
148+
<graphiql-spring-boot-starter.version>5.0.2</graphiql-spring-boot-starter.version>
149+
<graphql-java-tools.version>5.2.4</graphql-java-tools.version>
150+
<guava.version>18.0</guava.version>
151+
<git-commit-id-plugin.version>2.2.4</git-commit-id-plugin.version>
152+
<modelmapper.version>2.3.2</modelmapper.version>
153+
<problem-spring-web.version>0.23.0</problem-spring-web.version>
154+
</properties>
143155

144156
</project>

spring-boot-libraries/src/main/java/com/baeldung/Application.java renamed to spring-boot-libraries/src/main/java/com/baeldung/boot/Application.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
package org.baeldung.boot;
1+
package com.baeldung.boot;
22

33
import org.springframework.boot.SpringApplication;
44
import org.springframework.boot.autoconfigure.SpringBootApplication;
Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
package com.baeldung.boot.problem;
2+
3+
import org.springframework.boot.SpringApplication;
4+
import org.springframework.boot.autoconfigure.EnableAutoConfiguration;
5+
import org.springframework.boot.autoconfigure.SpringBootApplication;
6+
import org.springframework.boot.autoconfigure.web.servlet.error.ErrorMvcAutoConfiguration;
7+
import org.springframework.context.annotation.ComponentScan;
8+
9+
@SpringBootApplication
10+
@EnableAutoConfiguration(exclude = ErrorMvcAutoConfiguration.class)
11+
@ComponentScan("com.baeldung.boot.problem")
12+
public class SpringProblemApplication {
13+
14+
public static void main(String[] args) {
15+
System.setProperty("spring.profiles.active", "problem");
16+
SpringApplication.run(SpringProblemApplication.class, args);
17+
}
18+
19+
}
Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
package com.baeldung.boot.problem.advice;
2+
3+
import org.springframework.web.bind.annotation.ControllerAdvice;
4+
import org.zalando.problem.spring.web.advice.ProblemHandling;
5+
6+
@ControllerAdvice
7+
public class ExceptionHandler implements ProblemHandling {
8+
9+
}
Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
package com.baeldung.boot.problem.advice;
2+
3+
import org.springframework.web.bind.annotation.ControllerAdvice;
4+
import org.zalando.problem.spring.web.advice.security.SecurityAdviceTrait;
5+
6+
@ControllerAdvice
7+
public class SecurityExceptionHandler implements SecurityAdviceTrait {
8+
9+
}
Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
package com.baeldung.boot.problem.configuration;
2+
3+
import org.springframework.context.annotation.Bean;
4+
import org.springframework.context.annotation.Configuration;
5+
import org.zalando.problem.ProblemModule;
6+
import org.zalando.problem.validation.ConstraintViolationProblemModule;
7+
8+
import com.fasterxml.jackson.databind.ObjectMapper;
9+
10+
@Configuration
11+
public class ProblemDemoConfiguration {
12+
13+
@Bean
14+
public ObjectMapper objectMapper() {
15+
return new ObjectMapper().registerModules(new ProblemModule(), new ConstraintViolationProblemModule());
16+
}
17+
}
Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,31 @@
1+
package com.baeldung.boot.problem.configuration;
2+
3+
import org.springframework.beans.factory.annotation.Autowired;
4+
import org.springframework.context.annotation.Configuration;
5+
import org.springframework.context.annotation.Import;
6+
import org.springframework.security.config.annotation.web.builders.HttpSecurity;
7+
import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity;
8+
import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter;
9+
import org.zalando.problem.spring.web.advice.security.SecurityProblemSupport;
10+
11+
@Configuration
12+
@EnableWebSecurity
13+
@Import(SecurityProblemSupport.class)
14+
public class SecurityConfiguration extends WebSecurityConfigurerAdapter {
15+
16+
@Autowired
17+
private SecurityProblemSupport problemSupport;
18+
19+
@Override
20+
protected void configure(HttpSecurity http) throws Exception {
21+
http.csrf().disable();
22+
23+
http.authorizeRequests()
24+
.antMatchers("/")
25+
.permitAll();
26+
27+
http.exceptionHandling()
28+
.authenticationEntryPoint(problemSupport)
29+
.accessDeniedHandler(problemSupport);
30+
}
31+
}

0 commit comments

Comments
 (0)