gpt4 book ai didi

java - @ExceptionHandler 的顺序

转载 作者:塔克拉玛干 更新时间:2023-11-03 03:02:33 26 4
gpt4 key购买 nike

我使用 @ControllerAdvice 来处理我所有的应用程序异常:

@ControllerAdvice
public class ExceptionHandlingController {

@ExceptionHandler({UnauthorizedException.class})
public String unauthorizedException() {
.........
}


@ExceptionHandler({UnauthorizedAjaxException.class})
@ResponseBody
public void unauthorizedAjaxException() {
.........
}

@ExceptionHandler({Exception.class})
public String globalException(){
.........
}


}

在我的代码中的某处,我确实throw new UnauthorizedException();

   @Around("@annotation(Authenticated)")
public Object profilingAuthentication(ProceedingJoinPoint pjp) throws Throwable {

HttpServletRequest request = ((ServletRequestAttributes) RequestContextHolder.currentRequestAttributes()).getRequest();

if( request.getSession().getAttribute("idContact") == null ) {
if( "XMLHttpRequest".equals(request.getHeader("X-Requested-With")) )
throw new UnauthorizedAjaxException();
throw new UnauthorizedException();
}
return pjp.proceed();
}

但遗憾的是,Spring MVC 似乎通过使用最通用的情况(Exception)而不是更具体的情况(例如 UnauthorizedException)来随机运行。有时他会选择正确的!

订单如何运作?有什么方法可以指定顺序吗?

UnauthorizedException 是自定义异常

public class UnauthorizedException extends Exception {

public UnauthorizedException(){
super();
}

public UnauthorizedException(String message){
super(message);
}
}

更新

我发现它的顺序 not rondom 实际上抛出 UnauthorizedException 的方法正常工作,但其他方法不正常!

@Authenticated
@RequestMapping(value="/favoris")
public String favoris(ModelMap model, HttpServletRequest request)
throws UnauthorizedException {
....
}

@Authenticated
@RequestMapping(value="/follow")
public String follow(ModelMap model, HttpServletRequest request) {
.....
}

所以我必须手动添加 throws UnauthorizedException 还是有其他解决方案?

最佳答案

我们按以下方式使用异常处理程序,从不混合顺序,它按预期工作。因此,如果您将它用作以下示例,那么它可能会解决您的问题

************处理程序类******************

@ControllerAdvice
public class GlobalExceptionHandler {

@ResponseStatus(value = HttpStatus.INTERNAL_SERVER_ERROR)
@ExceptionHandler(value = Exception.class)
public boolean handle1(Exception exc) {
System.out.println("#####Global Exception###" + exc);
exc.printStackTrace(System.out);
return true;
}

@ResponseStatus(value = HttpStatus.INTERNAL_SERVER_ERROR)
@ExceptionHandler(value = CustomException.class)
public boolean handle2(CustomException exc) {
System.out.println("###custom exception######" + exc);
exc.printStackTrace(System.out);
return true;
}
}

*************** Controller 类************

@RestController("test")
@RequestMapping("/test1")
public class TestController {

@RequestMapping("/t1")
public boolean test() {
if (true) {
throw new CustomException();
}
return true;
}
}

在上面的例子中,异常 habdler 是 handle2 因为首先它会搜索匹配的异常,如果没有找到然后去父处理程序

如果我们抛出 new NullPointerException() 那么它将搜索匹配的处理程序但在这种情况下没有找到然后去寻找 handle1

更多可以引用here

希望对您有所帮助。谢谢

关于java - @ExceptionHandler 的顺序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38462588/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com