[英]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.