Exceptions annoted with ResponseStatus not converted to Problem on 0.26.x when using Spring Security
See original GitHub issueExceptions that are annoted with a @ResponseStatus
do not return a “Problem Response” with content-type application/problem+json
once the Spring Security Starter is on the classpath.
This error does not appear when using version 0.25.2 only when updating to a version >= 0.26.0
Description
The autoconfiguration is invoked, but the method still returns application/json
and the default spring boot error json:
import org.springframework.boot.autoconfigure.SpringBootApplication
import org.springframework.boot.runApplication
import org.springframework.context.annotation.Configuration
import org.springframework.http.HttpStatus
import org.springframework.security.config.annotation.web.builders.HttpSecurity
import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter
import org.springframework.web.bind.annotation.GetMapping
import org.springframework.web.bind.annotation.RequestMapping
import org.springframework.web.bind.annotation.ResponseStatus
import org.springframework.web.bind.annotation.RestController
@SpringBootApplication
class ProblemStarterWebIssueApplication
fun main(args: Array<String>) {
runApplication<ProblemStarterWebIssueApplication>(*args)
}
@RestController
@RequestMapping("/hello")
class HelloWorldController {
@GetMapping
fun sayHello() {
throw HelloNotFoundException()
}
}
@ResponseStatus(HttpStatus.NOT_FOUND)
class HelloNotFoundException() : RuntimeException("Hello not found")
@Configuration
class SecurityConfig() : WebSecurityConfigurerAdapter() {
override fun configure(http: HttpSecurity) {
http.anonymous().and().authorizeRequests().anyRequest().permitAll()
}
}
Expected Behavior
Calling GET http://localhost:8080/hello
returns a response with mediatype application/problem+json
and a corresponding body.
Actual Behavior
A response with mediatype application/json
is returned and the body matches the default spring boot error view json.
Possible Fix
Steps to Reproduce
- Create a Spring Boot project with web + security + kotlin
- Paste the code above in the main application file
- Execute the following test:
import org.junit.jupiter.api.Test
import org.springframework.beans.factory.annotation.Autowired
import org.springframework.boot.test.autoconfigure.web.servlet.AutoConfigureMockMvc
import org.springframework.boot.test.context.SpringBootTest
import org.springframework.http.HttpHeaders
import org.springframework.http.MediaType
import org.springframework.test.web.servlet.MockMvc
import org.springframework.test.web.servlet.get
import org.zalando.problem.spring.common.MediaTypes
@SpringBootTest
@AutoConfigureMockMvc
class ProblemStarterWebIssueApplicationTests {
@Autowired
lateinit var mockMvc: MockMvc
@Test
fun testProblemSupport() {
mockMvc.get("/hello") {
accept(MediaType.APPLICATION_JSON)
}.andExpect {
status { isNotFound }
header { string(HttpHeaders.CONTENT_TYPE, MediaTypes.PROBLEM_VALUE) }
}
}
}
- The test will fail
Context
Your Environment
- Version used: 0.26.2, kotlin 1.3.72 and 1.4.10 (both affected), spring boot 2.3.3 + 2.3.4
- Link to your project: project is not open sourced, reproducer is here: https://github.com/fr1zle/problem-web-issue
Issue Analytics
- State:
- Created 3 years ago
- Reactions:1
- Comments:5
Top Results From Across the Web
Spring ResponseStatusException - Baeldung
ResponseStatusException is a programmatic alternative to @ResponseStatus and is the base class for exceptions used for applying a status code to ...
Read more >Spring ResponseStatusException does not return reason
Strangely, Spring Boot 2.6.x changed this behavior again and the error message set on ResponseStatusException is not returned.
Read more >Spring Boot + Spring Security + JWT + MySQL + React Full ...
Configure Spring security to throw a 401 unauthorized error if a client tries to access a protected resource without a valid JWT token....
Read more >Home of Quarkus Cheat-Sheet - GitHub Pages
There is no way to scaffold a project in Gradle but you only need to do: plugins { id 'java' id 'io.quarkus' version...
Read more >Overview (Apache Juneau 7.2.1)
getInt( "age" ); // Convert it back into JSON. json = JsonSerializer. ... ATTR annotated properties, but there must not be an overlap...
Read more >Top Related Medium Post
No results found
Top Related StackOverflow Question
No results found
Troubleshoot Live Code
Lightrun enables developers to add logs, metrics and snapshots to live code - no restarts or redeploys required.
Start FreeTop Related Reddit Thread
No results found
Top Related Hackernoon Post
No results found
Top Related Tweet
No results found
Top Related Dev.to Post
No results found
Top Related Hashnode Post
No results found
Top GitHub Comments
Sure, i pushed the sample including the test here: https://github.com/fr1zle/problem-web-issue
If it’s a regression since the latest release then I’d start with a diff and check for interesting changes.
On Thu, 8 Oct 2020, 18:28 Timm Hirsens, notifications@github.com wrote: