由于应用程序的性质,我使用了一些个性化的安全后端,并正在尝试如何在我的REST API控制器中实现一些简单的错误返回。它很简单,可以在html页面控制器中完成,就像我在以下代码中所做的那样:
@Controller
public class HomeController {
@Autowired
private UserService userService;
@GetMapping("/home.html")
public String home(Model model) {
String redirect = "home";
if(!userService.getCurrentUser().isCanAccessService()) {
redirect = "unauthorized";
}
return redirect;
}
}
我可以轻松地将其重定向到我创建的未授权页面,因为我在这里返回了字符串值。但是,当我使用REST API时,并不是那么简单:
@RestController
public class bagelController {
@Autowired
private bagelService bagelService;
@Autowired
private UserService userService;
@GetMapping("/rest/bagel/search")
public Bagel searchBagel (@RequestParam(value = "bagel", required = false) String bagel,
@RequestParam(value = "bagelInd", required = false, defaultValue = "1") int bagelInd) {
Bagel bagel;
if(!userService.getCurrentUser().isBagelEditAccess()) {
bagel = null;
// I want to return a 401 or direct to my unathorized page if I get an invalid user here.
}
else {
bagel = bagelService.getbagel(bagel, bagelInd);
// if my bagel object returns null, I want to return a 404 or direct to a 404 not
found page here.
}
return bagel;
}
您可以有一个ControllerAdvice来处理异常及其HTTP返回代码。然后,您可以通过以下方式在其中注释方法,例如:
@ExceptionHandler(NoSuchEntityException.class)
@ResponseStatus(HttpStatus.NOT_FOUND)
每次遇到NoSuchEntityException
(自定义例外),都会返回404代码。因此,当您检查实体是否为null时,可以引发此类异常。您也可以将相同的东西用于401或任何其他HTTP代码。