globalmente errori maniglia (come HTTP 404), che possono verificarsi al di fuori di un controllore, devo voci simili al seguente nel mio web.xml:Spring MVC 3.2 - Negoziazione del contenuto per le pagine di errore?
<error-page>
<error-code>404</error-code>
<location>/errors/404</location>
</error-page>
Nella mia ErrorController ho corrispondenti metodi simili al seguente:
@Controller
@RequestMapping("/errors")
public class ErrorController {
@RequestMapping(value = "/404", method = RequestMethod.GET)
@ResponseBody
public ResponseEntity<ErrorResponse> error404() {
ErrorResponse errorBody = new ErrorResponse(404, "Resource Not Found!");
return new ResponseEntity<ErrorResponse>(errorBody, HttpStatus.NOT_FOUND);
}
}
Il problema che sto affrontando è che i ContentNegotiationManager
e messaggi convertitori ho configurato non vengono utilizzati in questo caso. Sospetto che dal momento che la richiesta viene reindirizzata alla pagina di errore, gli attributi della richiesta originale utilizzati nella negoziazione del contenuto vengono persi e questa viene considerata come una richiesta completamente separata. (es. richiesta originale per /mycontroller/badresource.json ->/errors/404 (senza estensione file))
C'è qualche modo in un gestore di errori come questo determinare e/o rispondere con il tipo di contenuto appropriato come richiesto nella richiesta originale?
Grazie per l'input. Ho visto quell'articolo, ma a meno che manchi qualcosa, gestisce solo le eccezioni dai controller e non gli errori generali della servlet. Inoltre, in questo contesto 'request.getRequestURI()' ti fornisce l'URI della pagina di errore. Sembra che tu debba usare 'req.getAttribute (" javax.servlet.error.request_uri ")' per ottenere l'URI della richiesta originale.Mi chiedo se c'è un modo per ignorare le informazioni che utilizza ContentNegotiationManager e impostarlo sulle informazioni dalla richiesta originale anziché sulla pagina degli errori? – WayneC