从弹簧启动支架控制器产生不同类型的响应

时间:2018-07-02 05:31:39

标签: java spring spring-boot

我有一个方案来创建一个rest方法,如果有任何验证失败,该方法将返回json响应。如果一切正确,请下载pdf方法。

是否可以通过相同的方法完成?

PFB方法签名是我需要实现的。

@RequestMapping(value = "/getPdf", method = RequestMethod.POST, consumes = MediaType.ALL_VALUE, produces = {"application/pdf","application/json"})
    public @ResponseBody LinkedHashMap<String, Object> getPdf(@Valid @RequestBody DownloadPdfDTO downloadPdfDTO,BindingResult result,HttpServletRequest request,HttpServletResponse response) throws IOException {
    }

当一切正确且正在下载PDF时,此方法可以正常工作。

但是当任何验证失败时,则没有响应得到渲染,并且我得到状态:406不可接受

谢谢

2 个答案:

答案 0 :(得分:2)

是的,您可以使用全局异常处理程序对其进行点缀。

@Order(Ordered.HIGHEST_PRECEDENCE)
@ControllerAdvice
public class GlobalExceptionHandler {

ObjectMapper objectMapper = new ObjectMapper();

@ExceptionHandler(AccessDeniedException.class)
public void handleAccessDenied(HttpServletResponse response, AccessDeniedException ex) {
    response.setStatus(HttpStatus.UNAUTHORIZED);
    try (PrintWriter writer = response.getWriter()) {
        objectMapper.writeValue(writer, YOUR_OBJECT_TO_RETURN);
    } catch (IOException ex) {
    }
}

@ExceptionHandler({MethodArgumentNotValidException.class, ConstraintViolationException.class})
public void handleException(HttpServletResponse response, Exception ex) {
    response.setStatus(HttpStatus.UNPROCESSABLE_ENTITY);
    try (PrintWriter writer = response.getWriter()) {
        objectMapper.writeValue(writer, YOUR_OBJECT_TO_RETURN);
    } catch (IOException ex) {
    }
}

@ExceptionHandler(NullPointerException.class)
public void handleNullPointerException(HttpServletResponse response, Exception ex) {
    //return your required response
}
}

答案 1 :(得分:1)

您可以将返回类型指定为ResponseEntity。使用ResponseEntity,您可以根据业务逻辑绑定不同的响应。

一个例子就是这样

    @ApiOperation(value = "Get PDF API", consumes = "application/json", httpMethod = "GET")
    @ApiResponses(value = {@ApiResponse(code = 404, message = "Bad request")})
    @RequestMapping(value = "/pdf/{filename}", headers = "Accept=application/json", method = RequestMethod.GET)
    public
    @ResponseBody
    ResponseEntity getPDF(@ApiParam(value = "filename", required = true) @PathVariable String filename) {
        try {

            Boolean validationPass = checkValidation();
            if (validationPass) {

                    resp = getPDF();
                    responseHeaders.setContentType(MediaType.APPLICATION_PDF);
                    responseHeaders.set("charset", "utf-8");
                    responseHeaders.setContentLength(resp.length);   
                    responseHeaders.set("Content-disposition", "attachment; filename=response.pdf");
                    return new ResponseEntity<>(resp,responseHeaders, HttpStatus.OK);
                }
                else {
                    // create your json validation eneity here
                    return new ResponseEntity<>(validation entity, HttpStatus.BAD_REQUEST);
                }

        } catch (Exception e) {
            return new ResponseEntity<>( createExceptionEntity(e)  ,HttpStatus.BAD_REQUEST);

        }
    }