Obtener valores de petición de ExceptionHandler utilizando Spring MVC

smash87:

Tengo un controlador MVC primavera y un controlador de excepciones. Cuando se produce una excepción, quiero que el controlador de excepciones para registrar los datos de todo el GET / POST que fue enviado en la solicitud. ¿Cómo se puede lograr esto?

Controlador:

@Controller
@RequestMapping("/foo")
public class FooController {
    private final FooService fooService;

    @PostMapping("/bar")
    @ResponseBody
    public BarObject doSomething(@RequestBody final FooContext context) 
    {
        return fooService.doSomething(context);
    }
}

Del controlador de excepciones:

@ControllerAdvice
public class ExceptionController {

    private final Logger log = LoggerFactory.getLogger(ExceptionController.class);

    @ResponseStatus(HttpStatus.BAD_REQUEST)
    @ExceptionHandler(Exception.class)
    @ResponseBody
    public ErrorMessage handleException(final HttpServletRequest request, final Exception exception) {
        //Retrieve request data 
        //request.getQueryString() 
        // How to get POST data if we cannot access @RequestBody?)
        log.error(request.getRequestURI(), exception);
        return new ErrorMessage(request.getRequestURI(), exception.getLocalizedMessage());
}
Martín Zaragoza :

Bueno, el cuerpo de la petición está en el HttpServletRequest.

Se podía acceder a la solicitud cuerpo RAW haciendo algo como:

String body = request.getReader().lines().collect(Collectors.joining(System.lineSeparator()));

Del método de controlador de excepción. (Usando java 8).

A continuación, puede analizar la cadena de cuerpo como un POJO.

EDITAR

Se ha observado que la respuesta avobe no funciona. Esto sucede porque cuando se analiza el cuerpo (con @RequestBody) la corriente de conexión HTTP se cierra, por lo tanto el cuerpo de la solicitud no se puede acceder de nuevo. Howver se podía inyectar una propiedad directamente a la httpRequest de su método de controlador y luego acceder al valor en su gestor de excepciones:

@RestController
@RequestMapping(ApiVersion.V1.prefix)
public class BatchController {
    @PostMapping("/batch")
    public @ResponseBody BatchResponse runBatch(@RequestBody BatchRequest batchRequest, HttpServletRequest request) throws IOException {
        System.out.println(batchRequest.getName());
        request.setAttribute("batchRequest" , batchRequest);
        throw new IllegalArgumentException("Some error");
    }

    @ExceptionHandler(IllegalArgumentException.class)
    public @ResponseBody BatchResponse handle(HttpServletRequest request) {
        BatchRequest batchRequest = (BatchRequest) request.getAttribute("batchRequest");
        System.out.println("handling exception");
        return new BatchResponse(batchRequest.getName());
    }
}

Espero que esto ayude

Supongo que te gusta

Origin http://43.154.161.224:23101/article/api/json?id=209851&siteId=1
Recomendado
Clasificación