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.问题描述
参数检查不是应该再数据库事务检查之前吗?参数错误不是应该程序中断吗?为什么这里我们自定义的参数的异常捕获无效,数据库事务的异常捕获却有效?
Le paramètre openId est nul, puis directement orm signale que le paramètre ne peut pas être vide, il devrait l'être, mais je n'en suis pas sûr.
Comme @onelove l'a dit, l'exception de paramètre illégal IllegalArgumentException n'est pas utilisée pour détecter si le paramètre du contrôleur est nul. J'ai écrit un test :
LaRequêteURL est la suivante :
http://localhost:8080
La console renvoie
null
Pour le contrôleur de Spring MVC, si le paramètre du contrôleur n'est pas trouvé dans la requête, le paramètre sera vide au lieu de lancer une exception . .
L'exception IllegalArgumentException se produit ici car la méthode findOne de la classe JpaRepository n'autorise pas les paramètres vides.