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.问题描述
参数检查不是应该再数据库事务检查之前吗?参数错误不是应该程序中断吗?为什么这里我们自定义的参数的异常捕获无效,数据库事务的异常捕获却有效?
openId 매개변수가 null이고 orm이 매개변수를 비워둘 수 없다고 직접 보고합니다. 비어 있어야 하는데 확실하지 않습니다.
@onelove가 말했듯이 불법 매개변수 예외 IllegalArgumentException은 컨트롤러 매개변수가 null인지 여부를 감지하는 데 사용되지 않습니다. 테스트를 작성했습니다:
으아악요청URL은 다음과 같습니다.
을 반환합니다.http://localhost:8080
콘솔이
null
Spring MVC 컨트롤러의 경우 요청에 컨트롤러 매개변수가 없으면 예외가 발생하는 대신 매개변수가 공백이 됩니다. .
여기서 IllegalArgumentException 예외가 발생하는 이유는 JpaRepository 클래스의 findOne 메소드가 빈 매개변수를 허용하지 않기 때문입니다.