如何使用Spring发送状态代码以及自定义类?

时间:2019-08-21 07:50:43

标签: java spring spring-boot

我正在尝试使用spring建立登录系统。问题是如果用户名不在数据库中,我想发送一个不同的状态码,如果用户名不在数据库中,但是密码错误,我想发送一个不同的状态码。因为在我的前端,我将根据状态代码使用不同的警报来通知用户。

我不能使用HttpStatus.NOT_ACCEPTABLE之类的东西,因为我的控制器正在返回一个User(我的自定义类)。它将返回User或null。

@GetMapping("/users")
    public User userLogin(@RequestParam String username,@RequestParam String password) {

        User user = userService.findByUsername(username);

        if(user==null) {
            return null;
        }

        if(user.getPassword().equals(password)) {
            return user;
        } else {
            return null;
        }

    }

在这里,我尝试更改状态,同时返回null。

2 个答案:

答案 0 :(得分:1)

Spring 5引入了ResponseStatusException类。我们可以创建一个提供HttpStatus并提供原因和原因的实例:

@GetMapping(value = "/{id}") public Foo findById(@PathVariable("id") Long id, HttpServletResponse response) {
    try {
        Foo resourceById = RestPreconditions.checkFound(service.findOne(id));

        eventPublisher.publishEvent(new SingleResourceRetrievedEvent(this, response));
        return resourceById;
     }
    catch (MyResourceNotFoundException exc) {
         throw new ResponseStatusException(
           HttpStatus.NOT_FOUND, "Foo Not Found", exc);
    } }

也许这是您要寻找的?

https://www.baeldung.com/exception-handling-for-rest-with-spring#controlleradvice中的详细信息

答案 1 :(得分:1)

您可以返回 ResponseEntity 以满足您的要求

@GetMapping("/users")
public ResponseEntity<User> userLogin(@RequestParam String username,@RequestParam String password) {

    User user = userService.findByUsername(username);

    if(user==null) {
        return new ResponseEntity<>(null,HttpStatus.NOT_FOUND);
    }

    if(user.getPassword().equals(password)) {
        return new ResponseEntity<>(user,HttpStatus.OK);
    } else {
        return new ResponseEntity<>(null,HttpStatus.FORBIDDEN);
    }

}