如果数据库查询在Spring Boot Webapp REST API控制器中返回空对象,如何以未授权用户的身份发送401和404?

问题描述 投票:0回答:1

由于应用程序的性质,我使用了一些个性化的安全后端,并正在尝试如何在我的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; 
    }
java spring-boot spring-restcontroller
1个回答
0
投票

您可以有一个ControllerAdvice来处理异常及其HTTP返回代码。然后,您可以通过以下方式在其中注释方法,例如:

@ExceptionHandler(NoSuchEntityException.class)
@ResponseStatus(HttpStatus.NOT_FOUND)

每次遇到NoSuchEntityException(自定义例外),都会返回404代码。因此,当您检查实体是否为null时,可以引发此类异常。您也可以将相同的东西用于401或任何其他HTTP代码。

© www.soinside.com 2019 - 2024. All rights reserved.