Impossible for me to say if this is a bug or a feature/documented change, hence the ticket. Facts:
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.
Impossible for me to say if this is a bug or a feature/documented change, hence the ticket. Facts:
test snippets:
results for 3.2.1:
results for 3.2.2:
Further details:
healthfrom/to e.g./foo"fixes" the behaviour (i.e. the endpoints start to work again)base-pathto 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 methodMy take on it is:
base-pathand 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.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.