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");
}
}
}
Run Code Online (Sandbox Code Playgroud)
案例 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); …Run Code Online (Sandbox Code Playgroud) 这是我用来向标头添加过滤器并添加 UUID 的代码
@Slf4j
public class ReqTxIdFilterImpl implements Filter {
@Override
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain)
throws IOException, ServletException {
HttpServletRequest request = (HttpServletRequest) servletRequest;
List<String> headerNames = Collections.list(request.getHeaderNames());
String requestTxId = "";
if(!headerNames.isEmpty()){
requestTxId = request.getHeader(
headerNames.stream()//
.filter(header -> header.contains("txId"))
.findAny()
.orElse("")//
);
}
if (StringUtils.isEmpty(requestTxId)) {
requestTxId = UUID.randomUUID().toString();
}
MDC.put("txId", requestTxId);
filterChain.doFilter(servletRequest, servletResponse);
MDC.clear();
}
}
Run Code Online (Sandbox Code Playgroud)
我使用 spring boot 和 MockMvc 来测试 API
@Autowired
private MockMvc mockMvc;
@Test
public void test_generatePolicyNumber() throws Exception { …Run Code Online (Sandbox Code Playgroud)