Open
Description
Impossible for me to say if this is a bug or a feature/documented change, hence the ticket. Facts:
- the config below worked fine before the patch from Actuator endpoints with no operations that use selectors are not accessible when mapped to / #35426 (e.g. SB actuator 3.2.1) - actually, it's been used for literal ages, since early 2.x versions
- after going to any version with Actuator endpoints with no operations that use selectors are not accessible when mapped to / #35426 fix, (e.g. SB actuator 3.2.2) - it suddenly breaks. The RestController is no longer accessible at all, app acts like it "disappeared", even though it is still listed in the mappings
test snippets:
@RestController
@RequestMapping("/api")
class TestController {
@PostMapping("endpoint")
fun endpoint(): HttpEntity<*> {
return ResponseEntity.EMPTY
}
}
management:
endpoints.web:
base-path: "/"
path-mapping:
health: "/"
results for 3.2.1:
GET -> 405
POST -> 200
PUT -> 405
results for 3.2.2:
GET -> 404
POST -> 405
PUT -> 405
Further details:
- The config shown doesn't throw any exception and never did.
- I also didn't notice any kind of warnings emitted with it (went through logs with DEBUG log level)
- Changing
health
from/
to e.g./foo
"fixes" the behaviour (i.e. the endpoints start to work again) - Changing
base-path
to anything else than/
(e.g./foo
) in this case triggers:Ambiguous mapping. Cannot map 'Actuator root web endpoint' method Actuator root web endpoint to {GET [/foo], produces [application/vnd.spring-boot.actuator.v3+json || application/vnd.spring-boot.actuator.v2+json || application/json]}: There is already 'Actuator web endpoint 'health'' bean method
My take on it is:
- If this config (i.e. both
base-path
and at least one of the mappings equal to/
) is deemed invalid, it should throw an exception during bean init for this particular case, like the case with non-/
base and/
endpoint. However, the valid use case for this was hiding the "root" actuator endpoint AFAIK. - If this config is deemed valid, the RestController should still work when that config is used.
With all honesty, I'd say this is a bug, mainly due to backwards-compatibility reasons. The code in question did work in previous patches in the same major/minor release (AFAIK both 3.2 and 3.1 are affected in this way), and a patch shouldn't introduce breaking changes that ain't backwards-compatible even if they are just fixing some abuses or corner cases (and the code shown isn't even really one of those I'd argue). If it would introduced purely with a minor increase and clearly documented, only the lack of exception thrown would be a problem here.
Activity