首頁  >  問答  >  主體

java - Spring mvc的异常处理:IllegalArgumentException

1.业务描述

我试图利用Spring MVC捕获处理URL参数错误的异常。

(1)通常情况,请求URL如下:

.../channel/beforeAdd?openid=1000

之后我们利用openid在数据库中进行匹配用户。

(2)异常发生,请求URL如下:

.../channel/before

(3)Spring MVC的异常处理报错如下:

2016-04-27 18:22:06.140 ERROR 5800 --- [nio-8080-exec-1] o.a.c.c.C.[.[.[/].[dispatcherServlet]    : Servlet.service() for servlet [dispatcherServlet] in context with path [] threw exception [Request processing failed; nested exception is org.springframework.dao.InvalidDataAccessApiUsageException: The given id must not be null!; nested exception is java.lang.IllegalArgumentException: The given id must not be null!] with root cause

(4)处理URL的控制器如下:

@Controller
@RequestMapping(value = "/channel")
public class ChannelController {
    @Autowired
    private CardRepository cardRepository;
    @RequestMapping(value = "/beforeAddChannel")
    public ModelAndView beforeAddChannel(String openid) throws CardNotFoundException {
        Card card = cardRepository.findOne(openid);
        if(card == null) {
            throw new CardNotFoundException();
        }
        ModelAndView modelAndView = new ModelAndView("addChannel");
        modelAndView.addObject("card", card);
        return modelAndView;
    }
}

2.自定义异常处理

注意到两个异常分别为:InvalidDataAccessApiUsageException和IllegalArgumentException。

我们利用@ExceptionHandler处理IllegalArgumentException

@ExceptionHandler(IllegalArgumentException.class)
public String handleIllegalArgumentException(){
    return "errors/illegalArgumentException";
}

网页没有跳转illegalArgumentException.html,系统报错依然。

我们再处理InvalidDataAccessApiUsageException

@ExceptionHandler(InvalidDataAccessApiUsageException.class)
public String handleInvalidDataAccessApiUsageException(){
    return "errors/invalidDataAccessApiUsage";
}

网页跳转invalidDataAccessApiUsage.html,系统不再报错。

3.问题描述

参数检查不是应该再数据库事务检查之前吗?参数错误不是应该程序中断吗?为什么这里我们自定义的参数的异常捕获无效,数据库事务的异常捕获却有效?

ringa_leeringa_lee2713 天前745

全部回覆(2)我來回復

  • 高洛峰

    高洛峰2017-04-17 17:48:26

    參數 openId為null,然後直接 orm 報參數不能為空​​,應該是的,不太確定。

    回覆
    0
  • 巴扎黑

    巴扎黑2017-04-17 17:48:26

    如@onelove 所說,非法參數異常IllegalArgumentException不是用來偵測控制器參數是否空值。我寫了一個測驗:

    @Controller
    @ResponseBody
    public class HelloController {
        @RequestMapping(value = "")
        String index(String id){
            System.out.println(id);
            return id;
        }
    }
    

    請求URL如下:http://localhost:8080
    控制台返回null

    Spring MVC的控制器來說,如果在請求中找不到控制器參數,參數就會置空,而不會拋出異常
    這裡的IllegalArgumentException異常之所以會產生是由於JpaRepository類別中的findOne方法不允許參數為空。

    回覆
    0
  • 取消回覆