小编dev*_*eak的帖子

是否可以直接从服务层抛出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");
       }
    }
}
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)

java spring exception spring-boot

10
推荐指数
1
解决办法
4443
查看次数

如何编写集成测试来检查 MDC 上下文中的内容?

这是我用来向标头添加过滤器并添加 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)

java logback mdc spring-boot

5
推荐指数
1
解决办法
1万
查看次数

标签 统计

java ×2

spring-boot ×2

exception ×1

logback ×1

mdc ×1

spring ×1