Skip to content

Commit 3ee9acb

Browse files
committed
build(deps): upgrade Spring Boot to 4.0.5 and fix delete endpoint to return 204
- bump spring boot parent version from 4.0.3 to 4.0.5 in movies-api and movies-shell - change delete endpoint to return 204 no content instead of the deleted resource - remove Include.EXCEPTION from error attributes to avoid leaking exception class names - update movies-shell client and command to handle void delete response - align tests and docs with the new delete behavior
1 parent acb3336 commit 3ee9acb

11 files changed

Lines changed: 22 additions & 31 deletions

File tree

‎AGENTS.md‎

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -87,8 +87,8 @@ npm test -- --reporter=verbose -t "renders"
8787

8888
| Module | Language | Framework | Key Version |
8989
|---|---|---|---|
90-
| `movies-api` | Java 25 | Spring Boot 4.0.3 | Lombok, H2, Spring Data JPA, springdoc-openapi 3.0.2 |
91-
| `movies-shell` | Java 25 | Spring Boot 4.0.3 | Spring Shell 4.0.1, Spring RestClient |
90+
| `movies-api` | Java 25 | Spring Boot 4.0.5 | Lombok, H2, Spring Data JPA, springdoc-openapi 3.0.2 |
91+
| `movies-shell` | Java 25 | Spring Boot 4.0.5 | Spring Shell 4.0.1, Spring RestClient |
9292
| `movies-ui` | JavaScript (ES2020+, no TypeScript) | React 19.2.4 | Vite 8, @vitejs/plugin-react, axios 1.13.x, MUI 7 (@mui/material, @mui/icons-material) |
9393
| Java build | — | Maven 3.9.12 (wrapper) | — |
9494

‎movies-api/pom.xml‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@
55
<parent>
66
<groupId>org.springframework.boot</groupId>
77
<artifactId>spring-boot-starter-parent</artifactId>
8-
<version>4.0.3</version>
8+
<version>4.0.5</version>
99
<relativePath/> <!-- lookup parent from repository -->
1010
</parent>
1111
<groupId>com.ivanfranchin</groupId>

‎movies-api/src/main/java/com/ivanfranchin/moviesapi/config/ErrorAttributesConfig.java‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@ ErrorAttributes errorAttributes() {
1919
@Override
2020
public Map<String, Object> getErrorAttributes(WebRequest webRequest, ErrorAttributeOptions options) {
2121
return super.getErrorAttributes(webRequest,
22-
options.including(Include.EXCEPTION, Include.MESSAGE, Include.BINDING_ERRORS));
22+
options.including(Include.MESSAGE, Include.BINDING_ERRORS));
2323
}
2424
};
2525
}

‎movies-api/src/main/java/com/ivanfranchin/moviesapi/movie/MovieServiceImpl.java‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
package com.ivanfranchin.moviesapi.movie;
22

3-
import com.ivanfranchin.moviesapi.movie.model.Movie;
43
import com.ivanfranchin.moviesapi.movie.exception.MovieNotFoundException;
4+
import com.ivanfranchin.moviesapi.movie.model.Movie;
55
import lombok.RequiredArgsConstructor;
66
import org.springframework.stereotype.Service;
77

‎movies-api/src/main/java/com/ivanfranchin/moviesapi/movie/MoviesController.java‎

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,8 @@
11
package com.ivanfranchin.moviesapi.movie;
22

3-
import com.ivanfranchin.moviesapi.movie.model.Movie;
43
import com.ivanfranchin.moviesapi.movie.dto.AddMovieRequest;
54
import com.ivanfranchin.moviesapi.movie.dto.MovieResponse;
5+
import com.ivanfranchin.moviesapi.movie.model.Movie;
66
import jakarta.validation.Valid;
77
import lombok.RequiredArgsConstructor;
88
import org.springframework.http.HttpStatus;
@@ -45,10 +45,10 @@ public MovieResponse addMovie(@Valid @RequestBody AddMovieRequest addMovieReques
4545
return MovieResponse.from(movie);
4646
}
4747

48+
@ResponseStatus(HttpStatus.NO_CONTENT)
4849
@DeleteMapping("/{imdbId}")
49-
public MovieResponse deleteMovie(@PathVariable String imdbId) {
50+
public void deleteMovie(@PathVariable String imdbId) {
5051
Movie movie = movieService.validateAndGetMovie(imdbId);
5152
movieService.deleteMovie(movie);
52-
return MovieResponse.from(movie);
5353
}
54-
}
54+
}

‎movies-api/src/test/java/com/ivanfranchin/moviesapi/MoviesApiIntegrationTests.java‎

Lines changed: 4 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,6 @@
22

33
import com.ivanfranchin.moviesapi.movie.dto.AddMovieRequest;
44
import com.ivanfranchin.moviesapi.movie.dto.MovieResponse;
5-
65
import org.junit.jupiter.api.Test;
76
import org.springframework.beans.factory.annotation.Autowired;
87
import org.springframework.boot.resttestclient.TestRestTemplate;
@@ -117,15 +116,13 @@ public void testAddMovieReturns400WhenYearIsNegative() {
117116
// -- DELETE /api/movies/{imdbId} --
118117

119118
@Test
120-
public void testDeleteMovieReturnsDeletedMovieAndRemovesIt() {
119+
public void testDeleteMovieReturns204AndRemovesIt() {
121120
addMovie("tt0120804", "Resident Evil", "Paul W.S. Anderson", 2002);
122121

123-
ResponseEntity<MovieResponse> deleteResponse = restTemplate.exchange(
124-
MOVIES_URL + "/tt0120804", HttpMethod.DELETE, HttpEntity.EMPTY, MovieResponse.class);
122+
ResponseEntity<Void> deleteResponse = restTemplate.exchange(
123+
MOVIES_URL + "/tt0120804", HttpMethod.DELETE, HttpEntity.EMPTY, Void.class);
125124

126-
assertThat(deleteResponse.getStatusCode()).isEqualTo(HttpStatus.OK);
127-
assertThat(deleteResponse.getBody()).isNotNull();
128-
assertThat(deleteResponse.getBody().imdbId()).isEqualTo("tt0120804");
125+
assertThat(deleteResponse.getStatusCode()).isEqualTo(HttpStatus.NO_CONTENT);
129126

130127
// Verify movie is gone
131128
ResponseEntity<String> getResponse = restTemplate.getForEntity(MOVIES_URL + "/tt0120804", String.class);

‎movies-api/src/test/java/com/ivanfranchin/moviesapi/movie/MoviesControllerTests.java‎

Lines changed: 2 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,6 @@
44
import com.ivanfranchin.moviesapi.movie.dto.AddMovieRequest;
55
import com.ivanfranchin.moviesapi.movie.exception.MovieNotFoundException;
66
import com.ivanfranchin.moviesapi.movie.model.Movie;
7-
87
import org.junit.jupiter.api.Test;
98
import org.springframework.beans.factory.annotation.Autowired;
109
import org.springframework.boot.webmvc.test.autoconfigure.WebMvcTest;
@@ -160,14 +159,12 @@ public void testAddMovieReturns400WhenYearIsZero() throws Exception {
160159
// -- DELETE /api/movies/{imdbId} --
161160

162161
@Test
163-
public void testDeleteMovieReturnsDeletedMovie() throws Exception {
162+
public void testDeleteMovieReturns204() throws Exception {
164163
Movie movie = buildMovie("tt0120804");
165164
when(movieService.validateAndGetMovie("tt0120804")).thenReturn(movie);
166165

167166
mockMvc.perform(delete("/api/movies/tt0120804"))
168-
.andExpect(status().isOk())
169-
.andExpect(jsonPath("$.imdbId").value("tt0120804"))
170-
.andExpect(jsonPath("$.title").value("Resident Evil"));
167+
.andExpect(status().isNoContent());
171168

172169
verify(movieService).deleteMovie(movie);
173170
}

‎movies-shell/pom.xml‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@
55
<parent>
66
<groupId>org.springframework.boot</groupId>
77
<artifactId>spring-boot-starter-parent</artifactId>
8-
<version>4.0.3</version>
8+
<version>4.0.5</version>
99
<relativePath/> <!-- lookup parent from repository -->
1010
</parent>
1111
<groupId>com.ivanfranchin</groupId>

‎movies-shell/src/main/java/com/ivanfranchin/moviesshell/client/MoviesApiClient.java‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -25,5 +25,5 @@ public interface MoviesApiClient {
2525
ResponseEntity<MovieResponse> addMovie(@RequestBody AddMovieRequest addMovieRequest);
2626

2727
@DeleteExchange("/{imdbId}")
28-
ResponseEntity<MovieResponse> deleteMovie(@PathVariable String imdbId);
28+
ResponseEntity<Void> deleteMovie(@PathVariable String imdbId);
2929
}

‎movies-shell/src/main/java/com/ivanfranchin/moviesshell/command/MoviesCommands.java‎

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -55,8 +55,8 @@ public String addMovie(@Option(longName = "imdbId", required = true) String imdb
5555
@Command(name = "delete-movie", description = "Delete movie", group = "Movies API")
5656
public String deleteMovie(@Option(longName = "imdbId", required = true) String imdbId) {
5757
try {
58-
ResponseEntity<MovieResponse> response = moviesApiClient.deleteMovie(imdbId);
59-
return String.format("%s %s", response.getStatusCode(), response.getBody());
58+
ResponseEntity<Void> response = moviesApiClient.deleteMovie(imdbId);
59+
return String.valueOf(response.getStatusCode());
6060
} catch (Exception e) {
6161
return "Error: " + e.getMessage();
6262
}

0 commit comments

Comments
 (0)