【问题标题】:Handle ResourceNotFoundException, message not good处理 ResourceNotFoundException,消息不好
【发布时间】:2016-07-19 01:31:03
【问题描述】:

我使用 spring boot 并开始管理错误。

我创建一个异常处理来处理未找到的资源。

@ControllerAdvice
public class RestResponseEntityExceptionHandler extends ResponseEntityExceptionHandler {

    @ExceptionHandler(ResourceNotFoundException.class)
    private ResponseEntity<Void> handleResourceNotFoundException(ResourceNotFoundException e) {
        return ResponseEntity.notFound().build();
    }
}

在我的控制器中我这样做

@RequestMapping(value = "/members/{memberId}", method = RequestMethod.GET)
public ResponseEntity getMemberById(@PathVariable("memberId") Long memberId) throws ResourceNotFoundException {
    MemberDto memberDto = memberService.getMemberById(memberId);
    return new ResponseEntity(memberDto, HttpStatus.OK);
}

@Override
public MemberDto getMemberById(Long memberId) throws ResourceNotFoundException {
    Member member = memberRepository.findOne(memberId);

    if (member == null) {
        throw new ResourceNotFoundException("Member not found");
    }

    return convertToMemberDto(member);
}

我只有几个成员,所以如果我打电话

localhost:/members/999

我在响应头中看到了 chrome

HTTP/1.1 404 Not Found
Server: Apache-Coyote/1.1
X-Content-Type-Options: nosniff
X-XSS-Protection: 1; mode=block
Cache-Control: no-cache, no-store, max-age=0, must-revalidate
Pragma: no-cache
Expires: 0
X-Frame-Options: DENY
Content-Length: 0
Date: Tue, 19 Jul 2016 01:04:25 GMT

为什么我没有收到消息:找不到会员? 这是管理 Spring Boot 错误的好方法吗? 如何管理控制器中不同类型的错误?

【问题讨论】:

    标签: spring spring-boot


    【解决方案1】:

    您需要更改异常处理程序以返回带有您要返回的错误消息的正文,即:

    @ControllerAdvice
    public class RestResponseEntityExceptionHandler extends ResponseEntityExceptionHandler {
    
        @ExceptionHandler(ResourceNotFoundException.class)
        private ResponseEntity<Void> handleResourceNotFoundException(ResourceNotFoundException e) {
              // log exception
              return ResponseEntity
                .status(HttpStatus.FORBIDDEN)
                .body("Member not found");
        }
    }
    

    【讨论】:

      【解决方案2】:

      https://www.baeldung.com/spring-response-status-exception

      从 2.3 版本开始,Spring Boot 在默认的错误页面中不再包含错误信息。原因是为了降低向客户泄露信息的风险

      要更改默认行为,我们可以使用 server.error.include-message 属性。

      让我们将其设置为始终,看看会发生什么:

      $ curl -i -s -X GET http://localhost:8081/actor/8 HTTP/1.1 404 内容类型:application/json;charset=UTF-8 传输编码:分块 日期:2020 年 12 月 26 日星期六 19:39:11 GMT

      { "时间戳": "2020-12-26T19:39:11.426+00:00", “状态”:404, “错误”:“未找到”, "message": "找不到演员", “路径”:“/演员/8” }

      正如我们所见,这一次,响应包含“Actor Not Found”错误消息。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-05-04
        • 1970-01-01
        • 1970-01-01
        • 2016-09-23
        相关资源
        最近更新 更多