Spring全局异常处理程序 - 不是MVC

时间:2017-12-11 14:25:36

标签: java spring

常规Spring(Boot)是否有办法进行全局异常处理,或者至少捕获任何未捕获的异常(例如可能随机发生的<record id="project_proposal_view_search" model="ir.ui.view"> <field name="name">project.part.search</field> <field name="model">project.proposal</field> <field name="arch" type="xml"> <search> <field name="name"/> <field name="project_id"/> <field name="code"/> <filter name="code" string="Starts with 910" domain="[('code','ilike', '910')]"/> </search> </field> </record> class ProjectProposal(models.Model): _name = 'project.proposal' _inherit = ['mail.thread'] code = fields.Char(compute='_compute_code') @api.multi @api.onchange('project_id', 'object', 'stage_id', 'part_template_id') def _compute_code(self): for r in self: code = [] if r.project_id: code.append(r.project_id.code or '') if r.object: code.append(r.object or '') if r.stage_id: code.append(r.stage_id.code or '') if r.part_template_id: code.append(r.part_template_id.code or '') r.code = '-'.join(code) )?

我已经用Google搜索过,但我发现的所有内容都与控制器的RuntimeException @ControllerAdvice进行了对话。仅仅是一般的全局异常处理程序。

我基本上只是想确保如果发生了一些我没有抓到的异常,我就会记录它以便了解它。

3 个答案:

答案 0 :(得分:1)

我认为spring并没有为此提供开箱即用的解决方案。

实现此目的的可能性是使用带注释的AOP(您可以在此处找到示例:Where can I catch non rest controller exceptions in spring?)。使用此方法,您可以为使用预定义注释注释的所有方法定义全局切入点。这种方法的好处是将所有错误处理逻辑放在一个地方。

答案 1 :(得分:0)

通过AOP添加你自己的东西,这样的东西会起作用:

@Aspect
@Component
public class ExceptionHandler {

    @AfterThrowing(pointcut = "within(*.*)", throwing = "t")
    public void log(Throwable t) {
        t.printStackTrace();
    }
}

查看cheat sheet以帮助切入点。

答案 2 :(得分:0)

最好扩展Spring的(300,300,3)类并以所需的方式自定义它,例如:

ImageDataGenerator

这样,您可以覆盖Spring的默认错误响应主体,声明自定义异常(例如ResponseEntityExceptionHandler),并允许Spring处理在import lombok.extern.slf4j.Slf4j; import org.springframework.http.HttpHeaders; import org.springframework.http.HttpStatus; import org.springframework.http.ResponseEntity; import org.springframework.lang.Nullable; import org.springframework.web.bind.annotation.ControllerAdvice; import org.springframework.web.bind.annotation.ExceptionHandler; import org.springframework.web.context.request.WebRequest; import org.springframework.web.servlet.mvc.method.annotation.ResponseEntityExceptionHandler; import javax.validation.ValidationException; @ControllerAdvice @Slf4j public class GlobalExceptionHandler extends ResponseEntityExceptionHandler { @ExceptionHandler(ValidationException.class) protected ResponseEntity<Object> handle(ValidationException ex) { return new ResponseEntity<>(getError(HttpStatus.BAD_REQUEST, ex), new HttpHeaders(), HttpStatus.BAD_REQUEST); } @ExceptionHandler protected ResponseEntity<Object> handle(Exception ex, WebRequest request) { try { return super.handleException(ex, request); } catch (Exception e) { return handleExceptionInternal(ex, null, new HttpHeaders(), HttpStatus.INTERNAL_SERVER_ERROR, request); } } @Override protected ResponseEntity<Object> handleExceptionInternal(Exception ex, @Nullable Object body, HttpHeaders headers, HttpStatus status, WebRequest request) { if (HttpStatus.Series.SERVER_ERROR == status.series()) { log.error("Unexpected error.", ex); } return new ResponseEntity<>(getError(status, ex), headers, status); } private ApiError getError(HttpStatus status, Exception ex) { return ApiError.builder() .status(status.value()) .message(ex.getMessage()) .build(); } } 中声明的默认异常。

  

请注意,尽管在Spring 4.x中不需要在ValidationException周围进行try-catch,但由于底层ResponseEntityExceptionHandler实现的更改,在Spring 5.x中是必需的。