弹簧未抛出的自定义异常

时间:2018-02-09 11:55:21

标签: java spring exception-handling nullpointerexception

我用Spring 5被动写了一个自定义异常

@ResponseStatus(value = HttpStatus.NOT_FOUND)
public class AddressNotFoundException extends RuntimeException{
    public AddressNotFoundException(String message) {
        super(message);
    }

我在服务中称之为:

@Override
public Mono<Address> getById(String id) {
    Address addressFound=repository.findById(id).block();
    if(Objects.equals(addressFound, null))
        throw new AddressNotFoundException("Address #"+id+" not found");
    return Mono.just

(addressFound);
    }

但是当我到达此页面时会抛出异常,但它不是404而是空指针异常和错误500页但是有正确的消息?

从不抛出AddressNotFound,只有Nullpointer异常但是我的自定义消息??? 你能帮帮我吗?

这是我的控制器:

  @GetMapping("/address/{id}")
    public Mono<Address> byId(@PathVariable String id) {
        return addressService.getById(id);
    }

由于

4 个答案:

答案 0 :(得分:0)

如果您的地址为空,

repository.findById(ID).block();

我想应该抛出NullPointerException。以这种方式,它永远不会到达代码行来抛出自定义异常。

答案 1 :(得分:0)

而不是扩展RuntimeException,而只是扩展通用Exception

Spring提供ControllerAdvice注释来拦截抛出的异常

@ControllerAdvice
public class ExceptionController extends ResponseEntityExceptionHandler {
  @ExceptionHandler(value = { AddressNotFoundException.class })
  protected ResponseEntity<Object> handleAddressNotFoundException(Exception ex, WebRequest request) {
    AddressNotFoundException notFound = (AddressNotFoundException)ex;
    return handleExceptionInternal(ex, String.valueOf(notFound), new HttpHeaders(), HttpStatus.NOT_FOUND, request);
  }

}

这会将错误作为404发送回客户端,您可以在客户端消化,通常以json字符串的形式显示给用户。可以覆盖异常toString方法以将其作为json返回,也可以编写可以执行此操作的辅助方法。

答案 2 :(得分:0)

您可能有一个HandlerExceptionResolver bean,由于某种原因导致500。请尝试暂时关闭它。

答案 3 :(得分:0)

我尝试过使用spring boot 1.5,它可以在没有webflux的情况下使用Spring Boot 2,所以看起来Webflux无法处理自定义异常???