我们能否直接从服务层抛出ResponseStatusException而不会在控制器级别抛出自定义异常和处理?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了我们能否直接从服务层抛出ResponseStatusException而不会在控制器级别抛出自定义异常和处理?相关的知识,希望对你有一定的参考价值。

Spring 5引入了ResponseStatusException,这是直接从服务层抛出此异常的一种好习惯。

案例1:

@Service
public class UserService {
    public User findUserByName(String username) {
       User user = userRepository.findByUsernName(username);
       if(null == user) {
          throw new ResponseStatusException(HttpStatus.NOT_FOUND, "user not found");
       }
    }
}

案例2:还是我们需要使用自定义异常并在控制器级别处理它?在这种情况下,我们正在捕获CustomException并引发ResponseStatusException,为什么我们必须再次捕获该自定义异常,而不是使用Case 1

@Service
public class UserService {
    public User findUserByName(String username) {
       User user = userRepository.findByUsernName(username);
       if(null == user) {
          throw new UserNotFoundException("user not found");
       }
    }
}

@RestController
public class UserController {

    @GetMapping(path="/get-user")
    public ResponseEntity<User> getUser(String username) {
      try {
         userService.findUserByName(username);
      } catch (UserNotFoundException ex) {
         throw new ResponseStatusException(HttpStatus.NOT_FOUND, "user not found");
      }
    }
}
答案

正如评论中提到的,您可以在错误中创建映射。然后,您无需在控制器中使用try块。

import org.springframework.http.HttpStatus;
import org.springframework.web.bind.annotation.ResponseStatus;

@ResponseStatus(value = HttpStatus.NOT_FOUND, reason = "user not found")
public class UserNotFoundException extends RuntimeException {

    public UserNotFoundException(String message) {

        super(message);
    }
} 

以上是关于我们能否直接从服务层抛出ResponseStatusException而不会在控制器级别抛出自定义异常和处理?的主要内容,如果未能解决你的问题,请参考以下文章

业务层错误和服务层处理——最好的方法?

Windows Azure Web 角色 useUnsafeHeaderParsing="true" 无法正常工作,得到“服务器违反协议。Section=ResponseStatu

数据对象存储优劣

在 Android 上,Crashlytics 能否“看到”服务中发生的崩溃?

Java在Service层异常封装

synchronized重入后抛出异常,锁释放了吗