java - 是否可以直接从服务层抛出ResponseStatusException,而无需在 Controller 层面抛出自定义异常和处理?

标签 java spring spring-boot exception

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:
还是我们需要使用自定义异常并在 Controller 级别处理它?在这种情况下,我们正在捕获 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");
      }
    }
}

最佳答案

正如评论中提到的,您可以在错误中创建映射。那么你不需要在 Controller 中使用 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);
    }
} 

关于java - 是否可以直接从服务层抛出ResponseStatusException,而无需在 Controller 层面抛出自定义异常和处理?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59626027/

相关文章:

java - 错误 : java: package org. springframework.boot 不存在

java - 重写 hybris commonI18NService roundCurrency 方法

spring - Autowiring 请求范围 bean 的方法

java - 我想在不使用 split 函数的情况下分割字符串?

java - 如何检查所有类都已在 Gradle 中测试

java - 在浏览器中运行 Eclipse 制作的小程序时遇到问题

java - 无法解析符号 此检查控制是否对 Persistence QL 查询进行错误检查

java - Spring 启动2 : Apparent connection leak detected when using Flyway

java - Spring 启动 : Unable to start embedded Tomcat servlet container

java - 立即停止线程中的 Runnable