代码之家  ›  专栏  ›  技术社区  ›  Wim Deblauwe

如何使用Spring Boot获取409 for ObjectOptimiciLockingFailureException?

  •  0
  • Wim Deblauwe  · 技术社区  · 5 年前

    我知道Spring Boot将在以下位置渲染Thymeleaf模板 error/409.html 对于默认情况下导致状态码为409 CONFLICT的异常。然而,似乎 ObjectOptimisticLockingFailureException 默认情况下给出500服务器错误。

    我能够处理异常并“手动”重定向到 错误/409.html 使用模板 @ControllerAdvice 这样地:

    @ControllerAdvice
    public class GlobalControllerAdvice {
    
        @ResponseStatus(HttpStatus.CONFLICT)
        @ExceptionHandler({DataIntegrityViolationException.class, ObjectOptimisticLockingFailureException.class})
        public ModelAndView handleConflict(HttpServletRequest request, Exception e) {
            ModelAndView result = new ModelAndView("error/409");
            result.addObject("url", request.getRequestURL());
            return result;
        }
    }
    

    自从 Object乐观锁定失败异常 不是我自己代码的一部分,我无法用 @ResponseStatus(HttpStatus.CONFLICT) 拥有409。

    是否可以绘制地图 Object乐观锁定失败异常 到409,并在Spring Boot中使用默认错误模板机制来处理错误代码?

    0 回复  |  直到 5 年前
        1
  •  0
  •   shasr    5 年前

    我们可以尝试使用ResponseEntity,如下所示

        @ExceptionHandler({DataIntegrityViolationException.class, ObjectOptimisticLockingFailureException.class})
    public ResponseEntity<ModelAndView> handleConflict(HttpServletRequest request, Exception e) {
        ModelAndView result = new ModelAndView("error/409");
        result.addObject("url", request.getRequestURL());
        return new ResponseEntity<>(result, HttpStatus.CONFLICT);
    }
    
        2
  •  0
  •   Kavithakaran Kanapathippillai    5 年前

    这可能行得通

        @Bean(name="simpleMappingExceptionResolver")
        public SimpleMappingExceptionResolver
                      createSimpleMappingExceptionResolver() {
        SimpleMappingExceptionResolver r =
                    new SimpleMappingExceptionResolver();
    
        Properties mappings = new Properties();
        mappings.setProperty("ObjectOptimisticLockingFailureException", "error/409");
    
    
        r.setExceptionMappings(mappings);
        return r;
      }
    
        3
  •  0
  •   Prasannjeet Singh    3 年前

    你能抓住这个例外吗 ObjectOptimisticLockingFailureException 然后用409重新抛出异常?

    try {
        //perform your task here
    } catch (ObjectOptimisticLockingFailureException e) {
        var ex = new ClientErrorException(409, e);
        throw ex;
    }