我们能否直接从服务层抛出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