From 6b11f9eb89a96956a414b7f1dcf5be0e431ffc68 Mon Sep 17 00:00:00 2001
From: AleWu <77410271+TheAleWu@users.noreply.github.com>
Date: Fri, 10 Jul 2026 13:52:23 +0200
Subject: [PATCH 1/2] implements static analysis via SpotBugs for microservices
---
.github/workflows/ci.yml | 5 +++++
scripts/test-backends.js | 8 ++++----
services/admin-service/pom.xml | 15 +++++++++++++++
services/calendar-service/pom.xml | 15 +++++++++++++++
services/checklist-service/pom.xml | 15 +++++++++++++++
services/note-service/pom.xml | 15 +++++++++++++++
services/shared/pom.xml | 15 +++++++++++++++
.../devopss26/shared/security/JWTHelper.java | 2 +-
services/spotbugs-exclude.xml | 17 +++++++++++++++++
services/user-service/pom.xml | 15 +++++++++++++++
.../userservice/config/SecurityConfig.java | 8 +-------
.../userservice/service/JwtService.java | 2 +-
12 files changed, 119 insertions(+), 13 deletions(-)
create mode 100644 services/spotbugs-exclude.xml
diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml
index 930e7a6..d7173df 100644
--- a/.github/workflows/ci.yml
+++ b/.github/workflows/ci.yml
@@ -74,6 +74,11 @@ jobs:
cd services/${{ matrix.service }}
mvn clean test
+ - name: Static Analysis with Spotbugs
+ run: |
+ cd services/${{ matrix.service }}
+ mvn compile spotbugs:check
+
frontend-test:
name: Build & Test Frontend
needs: openapi-lint
diff --git a/scripts/test-backends.js b/scripts/test-backends.js
index 98d7f42..cad72c6 100644
--- a/scripts/test-backends.js
+++ b/scripts/test-backends.js
@@ -11,7 +11,7 @@ if (fs.existsSync(servicesDir)) {
const pomPath = path.join(servicesDir, service, 'pom.xml');
if (fs.existsSync(pomPath)) {
console.log(`\n========================================`);
- console.log(`Running tests for service: ${service}`);
+ console.log(`Running tests and static analysis for service: ${service}`);
console.log(`========================================`);
try {
const serviceDir = path.join(servicesDir, service);
@@ -20,12 +20,12 @@ if (fs.existsSync(servicesDir)) {
? (process.platform === 'win32' ? 'mvnw.cmd' : './mvnw')
: 'mvn';
- execSync(`${cmd} clean test -Dsurefire.exitTimeout=1 -DargLine="-Dlogging.level.com.tngtech.archunit.core.importer.ClassFileProcessor=ERROR"`, {
+ execSync(`${cmd} clean test spotbugs:check -Dsurefire.exitTimeout=1 -DargLine="-Dlogging.level.com.tngtech.archunit.core.importer.ClassFileProcessor=ERROR"`, {
cwd: serviceDir,
stdio: 'inherit'
});
} catch (error) {
- console.error(`\nTests failed for service: ${service}`);
+ console.error(`\nTests or static analysis failed for service: ${service}`);
failed = true;
}
}
@@ -35,5 +35,5 @@ if (fs.existsSync(servicesDir)) {
if (failed) {
process.exit(1);
} else {
- console.log('\nAll backend tests completed successfully.');
+ console.log('\nAll backend tests and static analysis completed successfully.');
}
diff --git a/services/admin-service/pom.xml b/services/admin-service/pom.xml
index 36f05fa..2395279 100644
--- a/services/admin-service/pom.xml
+++ b/services/admin-service/pom.xml
@@ -198,6 +198,21 @@
+
+ com.github.spotbugs
+ spotbugs-maven-plugin
+ 4.10.2.0
+
+ ${project.basedir}/../spotbugs-exclude.xml
+
+
+
+ com.github.spotbugs
+ spotbugs
+ 4.10.2
+
+
+
diff --git a/services/calendar-service/pom.xml b/services/calendar-service/pom.xml
index 3b56d81..b64ce71 100644
--- a/services/calendar-service/pom.xml
+++ b/services/calendar-service/pom.xml
@@ -220,6 +220,21 @@
+
+ com.github.spotbugs
+ spotbugs-maven-plugin
+ 4.10.2.0
+
+ ${project.basedir}/../spotbugs-exclude.xml
+
+
+
+ com.github.spotbugs
+ spotbugs
+ 4.10.2
+
+
+
diff --git a/services/checklist-service/pom.xml b/services/checklist-service/pom.xml
index 0a3fa77..af8d306 100644
--- a/services/checklist-service/pom.xml
+++ b/services/checklist-service/pom.xml
@@ -204,6 +204,21 @@
+
+ com.github.spotbugs
+ spotbugs-maven-plugin
+ 4.10.2.0
+
+ ${project.basedir}/../spotbugs-exclude.xml
+
+
+
+ com.github.spotbugs
+ spotbugs
+ 4.10.2
+
+
+
diff --git a/services/note-service/pom.xml b/services/note-service/pom.xml
index 69f4d4c..74befe4 100644
--- a/services/note-service/pom.xml
+++ b/services/note-service/pom.xml
@@ -220,6 +220,21 @@
+
+ com.github.spotbugs
+ spotbugs-maven-plugin
+ 4.10.2.0
+
+ ${project.basedir}/../spotbugs-exclude.xml
+
+
+
+ com.github.spotbugs
+ spotbugs
+ 4.10.2
+
+
+
diff --git a/services/shared/pom.xml b/services/shared/pom.xml
index c0b981c..db276d8 100644
--- a/services/shared/pom.xml
+++ b/services/shared/pom.xml
@@ -101,6 +101,21 @@
+
+ com.github.spotbugs
+ spotbugs-maven-plugin
+ 4.10.2.0
+
+ ${project.basedir}/../spotbugs-exclude.xml
+
+
+
+ com.github.spotbugs
+ spotbugs
+ 4.10.2
+
+
+
diff --git a/services/shared/src/main/java/de/tum/devopss26/shared/security/JWTHelper.java b/services/shared/src/main/java/de/tum/devopss26/shared/security/JWTHelper.java
index 0b2be8c..7a492a4 100644
--- a/services/shared/src/main/java/de/tum/devopss26/shared/security/JWTHelper.java
+++ b/services/shared/src/main/java/de/tum/devopss26/shared/security/JWTHelper.java
@@ -3,7 +3,7 @@
import io.jsonwebtoken.Claims;
import jakarta.servlet.http.HttpServletRequest;
-public class JWTHelper {
+public final class JWTHelper {
private JWTHelper() {
throw new IllegalAccessError("Illegal access of JWTHelper - No instantiation!");
diff --git a/services/spotbugs-exclude.xml b/services/spotbugs-exclude.xml
new file mode 100644
index 0000000..685b4aa
--- /dev/null
+++ b/services/spotbugs-exclude.xml
@@ -0,0 +1,17 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/services/user-service/pom.xml b/services/user-service/pom.xml
index a57dea6..d2b1a1a 100644
--- a/services/user-service/pom.xml
+++ b/services/user-service/pom.xml
@@ -246,6 +246,21 @@
+
+ com.github.spotbugs
+ spotbugs-maven-plugin
+ 4.10.2.0
+
+ ${project.basedir}/../spotbugs-exclude.xml
+
+
+
+ com.github.spotbugs
+ spotbugs
+ 4.10.2
+
+
+
diff --git a/services/user-service/src/main/java/de/tum/devopss26/userservice/config/SecurityConfig.java b/services/user-service/src/main/java/de/tum/devopss26/userservice/config/SecurityConfig.java
index 90ff27b..bf0f515 100644
--- a/services/user-service/src/main/java/de/tum/devopss26/userservice/config/SecurityConfig.java
+++ b/services/user-service/src/main/java/de/tum/devopss26/userservice/config/SecurityConfig.java
@@ -18,12 +18,6 @@
@EnableWebSecurity
public class SecurityConfig {
- private final JwtAuthenticationFilter jwtAuthFilter;
-
- public SecurityConfig(JwtAuthenticationFilter jwtAuthFilter) {
- this.jwtAuthFilter = jwtAuthFilter;
- }
-
@Bean
@Order(1)
public SecurityFilterChain loginSecurityFilterChain(HttpSecurity http) {
@@ -39,7 +33,7 @@ public SecurityFilterChain loginSecurityFilterChain(HttpSecurity http) {
@Bean
@Order(2)
- public SecurityFilterChain apiSecurityFilterChain(HttpSecurity http) {
+ public SecurityFilterChain apiSecurityFilterChain(HttpSecurity http, JwtAuthenticationFilter jwtAuthFilter) {
http
.csrf(AbstractHttpConfigurer::disable)
.authorizeHttpRequests(auth -> auth
diff --git a/services/user-service/src/main/java/de/tum/devopss26/userservice/service/JwtService.java b/services/user-service/src/main/java/de/tum/devopss26/userservice/service/JwtService.java
index 6078994..c92643e 100644
--- a/services/user-service/src/main/java/de/tum/devopss26/userservice/service/JwtService.java
+++ b/services/user-service/src/main/java/de/tum/devopss26/userservice/service/JwtService.java
@@ -20,7 +20,7 @@
import java.util.function.Function;
@Service
-public class JwtService {
+public final class JwtService {
private static final long EXPIRATION_MS = 24 * 60 * 60 * 1000L;
private final PrivateKey privateKey;
From c6deeafe1b5a0d86a95818bc2cc808afe3b244dc Mon Sep 17 00:00:00 2001
From: AleWu <77410271+TheAleWu@users.noreply.github.com>
Date: Fri, 10 Jul 2026 13:56:08 +0200
Subject: [PATCH 2/2] removed unnecessary extractUserId function
---
.../java/de/tum/devopss26/userservice/service/JwtService.java | 4 ----
1 file changed, 4 deletions(-)
diff --git a/services/user-service/src/main/java/de/tum/devopss26/userservice/service/JwtService.java b/services/user-service/src/main/java/de/tum/devopss26/userservice/service/JwtService.java
index c92643e..5af6178 100644
--- a/services/user-service/src/main/java/de/tum/devopss26/userservice/service/JwtService.java
+++ b/services/user-service/src/main/java/de/tum/devopss26/userservice/service/JwtService.java
@@ -73,10 +73,6 @@ public String extractUsername(String token) {
return extractClaim(token, claims -> claims.get("name", String.class));
}
- public String extractUserId(String token) {
- return extractClaim(token, Claims::getSubject);
- }
-
public Date extractExpiration(String token) {
return extractClaim(token, Claims::getExpiration);
}