简体   繁体   English

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

[英]Produce Different type of response from spring boot rest controller

I have a scenario to create a rest method which return json response if there is any validation fail. 我有一个场景来创建一个rest方法,如果有任何验证失败,它会返回json响应。 and if everything is correct then download a pdf method. 如果一切正确,请下载pdf方法。

Is it possible to be done via same method? 是否可以通过相同的方法来完成?

PFB the method signature what i need to achieve. 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 {
    }

This Method works fine when everything correct and PDF is getting download. 当一切正确并且正在下载PDF时,此方法可以正常工作。

But when there is any validation fail then no response is getting render and i am getting Status : 406 Not Acceptable . 但是当任何验证失败时,则没有响应得到渲染,并且我得到状态:406不可接受

Thanks 谢谢

Yes u can dot it using global exception handler. 是的,您可以使用全局异常处理程序对其进行点缀。

@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
}
}

You can give a return type as ResponseEntity. 您可以将返回类型指定为ResponseEntity。 With ResponseEntity you can bind different response as per your business logic. 使用ResponseEntity,您可以根据业务逻辑绑定不同的响应。

An example will be like this 一个例子就是这样

    @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);

        }
    }

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM