【发布时间】:2020-02-09 21:05:59
【问题描述】:
我的代码从 Flux 元素库(已创建)中调用 Mono 元素。包括带有“getJobById”的@Repository 类和@Component 类“Handler”来处理getAll、getJobById、post、put、delete 等请求。如果我输入错误的 id - 无法处理异常并收到 NullPointerException 错误。 我想捕获异常。
错误:
java.lang.NullPointerException: null at com.javasampleapproach.webflux.repo.impl.JobClientRepositoryImpl.getJobById(JobClientRepositoryImpl.java:32) ~[classes/:na]
at com.javasampleapproach.webflux.functional.handler.JobClientHandler.getJobById(JobClientHandler.java:52) ~[classes/:na]
已经试过了:
@ControllerAdvice
public class ClientExceptionController {
@ExceptionHandler(value = ClientNotfoundException.class)
public ResponseEntity<Object> exception(ClientNotfoundException exception) {return new ResponseEntity<>("Id not found", HttpStatus.NOT_FOUND);}
+
public class ClientNotfoundException extends NullPointerException{
public ClientNotfoundException() {}
public ClientNotfoundException(String s) {
super(s);
}
and in Handler and Repository classes:
if(jobClientRepository.getJobById(jobId).equals(null)) throw new ClientNotfoundException();
我也试过这样:
Mono<JobClient> jobMono = jobClientRepository.getJobById(jobId)
.onErrorResume(e->Mono.empty());
@Component
public Mono<ServerResponse> getJobById(ServerRequest request) {
long jobId = Long.valueOf(request.pathVariable("id"));
Mono<ServerResponse> notFound = ServerResponse.notFound().build();
我试过这个:
if(jobClientRepository.getJobById(jobId).equals(null)) throw new ClientNotfoundException();
此处出现错误:
Mono<JobClient> jobMono = jobClientRepository.getJobById(jobId).onErrorResume(e->Mono.empty());
return jobMono.flatMap(job -> ServerResponse.ok().contentType(MediaType.APPLICATION_JSON).body(fromObject(job))).switchIfEmpty(notFound).onErrorResume(ClientNotfoundException.class, e -> notFound);
@Repository
@Override
public Mono<JobClient> getJobById(Long id) {if(jobStores.get(id).equals(null)) throw new ClientNotfoundException();
return Mono.just(jobStores.get(id)).onErrorResume(e -> Mono.error(new ClientNotfoundException("Correct ID is required"+e)));
【问题讨论】:
-
您是否尝试在服务类中处理错误而不是覆盖存储库中的方法?
-
你的意思是如果我添加了 .doOnError 之类的,或者像这里描述的 blog.knoldus.com/… - 我做到了。
-
你确定这就是在 java
if(jobStores.get(id).equals(null))中进行空值检查的方式吗? -
Sagarr - 不确定)我是初学者。
标签: java spring-boot error-handling spring-webflux