我有一个方案来创建一个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不可接受。
谢谢
答案 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);
}
}