我用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);
}
由于
答案 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无法处理自定义异常???