我需要在休息控制器中捕捉 NullPointerException 吗?

Do i need to catch NullPointerException in rest controller?

我知道 NPE 是未经检查的 (RTE),因此我们需要防止它发生而不是抓住它:https://www.javaworld.com/article/2072719/effective-java-nullpointerexception-handling.html

但是,假设我有一个 REST 控制器,根据请求 return 是一个员工记录。这取决于在进行更新之前在数据库中找到基础员工记录。请参阅以下示例:

@RequestMapping(value = BENEFIT_VERSION, method = GET)
@PreAuthorize(READ_COMPANY_DATA)
public ResponseEntity get(@PathVariable UUID employerId,
                              @PathVariable Long versionId) {
    log.info("Request to fetch benefit version, employerId: {}, versionId: {}", employerId, versionId);

    BenefitVersion benefitVersion = benefitVersionService.findByEmployerIdAndId(employerId, versionId); <--- Here NPE may be thrown

    if (benefitVersion == null) {
        log.warn("Unable to fetch non-existent benefit version, employerId: %s, ID: %s", employerId, versionId);
        return new ResponseEntity(NOT_FOUND);
    }

    RestBenefitVersion restBenefitVersion = restBenefitVersionAssemblerFacade.toResource(benefitVersion);

    return new ResponseEntity<>(restBenefitVersion, OK);
}

benefitVersionService.findByEmployerIdAndId(employerId, versionId) 位可能会抛出 NPE。

与此控制器关联的 NPE 没有处理程序,因此 NPE 将简单地终止请求处理。为这种情况提供一个 NPE 处理程序来 return 对客户端的有意义的响应是可以的还是更好?

最佳做法是处理并向客户端提供有意义的消息。 REST 框架通常提供配置异常处理程序和映射器的方法。为 Spring 检查 this。您可以为您的 REST 框架找到类似的机制。