Java 在SpringBootWebFlux中管理空指针异常

Java 在SpringBootWebFlux中管理空指针异常,java,spring-boot,error-handling,spring-webflux,Java,Spring Boot,Error Handling,Spring Webflux,我的代码从元素的通量基(已经创建)调用Mono元素。包括带有“getJobById”的@Repository类和@Component类“Handler”,以处理请求,如getAll、getJobById、post、put、delete。如果我输入了错误的id-无法处理异常并接收NullPointerException错误。 我想捕捉异常 错误: java.lang.NullPointerException: null at com.javasampleapproach.webflux.repo.

我的代码从元素的通量基(已经创建)调用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());
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)));
Mono-jobMono=jobClientRepository.getJobById(jobId.onErrorResume(e->Mono.empty());
返回jobMono.flatMap(job->ServerResponse.ok().contentType(MediaType.APPLICATION_JSON).body(fromObject(job)).switchIfEmpty(notFound).onErrorResume(ClientNotfoundException.class,e->notFound);
@存储库
@凌驾
公共Mono getJobById(长id){if(jobStores.get(id).equals(null))抛出新的ClientNotfoundException();
返回Mono.just(jobStores.get(id)).onErrorResume(e->Mono.error(new ClientNotfoundException(“需要正确的id”+e));
试试这个:

@Repository 
@Override
public Mono<JobClient> getJobById(Long id)  {
    if(jobStores.get(id) == null) throw new ClientNotfoundException();
    return Mono.just(jobStores.get(id)).onErrorResume(e -> Mono.error(new ClientNotfoundException("Correct ID is required"+e)));
}
试试这个:

@Repository 
@Override
public Mono<JobClient> getJobById(Long id)  {
    if(jobStores.get(id) == null) throw new ClientNotfoundException();
    return Mono.just(jobStores.get(id)).onErrorResume(e -> Mono.error(new ClientNotfoundException("Correct ID is required"+e)));
}

你需要将常规编程和反应式编程分开。试试这个

@Repository 
@Override
public Mono<JobClient> getJobById(Long id)  {
    return Optional.ofNullable(jobStore.get(id))
            .map(Mono::just)
            .orElseGet(Mono::empty);
}

//Then call it
getJobById(1L).map(jobClient -> ServerResponse.ok()
            .contentType(MediaType.APPLICATION_JSON)
            .syncBody(jobClient)
        ).switchIfEmpty(Mono.error(ClientNotfoundException::new));
@存储库
@凌驾
公共Mono getJobById(长id){
返回可选的.ofNullable(jobStore.get(id))
.map(Mono::just)
.orElseGet(Mono::empty);
}
//那就叫它
getJobById(1L).map(jobClient->ServerResponse.ok()
.contentType(MediaType.APPLICATION_JSON)
.syncBody(作业客户端)
).switchIfEmpty(Mono.error(ClientNotfoundException::new));

没有运行在手机上编写的代码。

您需要将常规编程与反应式编程分开。试试这个

@Repository 
@Override
public Mono<JobClient> getJobById(Long id)  {
    return Optional.ofNullable(jobStore.get(id))
            .map(Mono::just)
            .orElseGet(Mono::empty);
}

//Then call it
getJobById(1L).map(jobClient -> ServerResponse.ok()
            .contentType(MediaType.APPLICATION_JSON)
            .syncBody(jobClient)
        ).switchIfEmpty(Mono.error(ClientNotfoundException::new));
@存储库
@凌驾
公共Mono getJobById(长id){
返回可选的.ofNullable(jobStore.get(id))
.map(Mono::just)
.orElseGet(Mono::empty);
}
//那就叫它
getJobById(1L).map(jobClient->ServerResponse.ok()
.contentType(MediaType.APPLICATION_JSON)
.syncBody(作业客户端)
).switchIfEmpty(Mono.error(ClientNotfoundException::new));


没有在手机上运行该代码。

您是否尝试过在服务类中处理错误,而不是重写存储库中的方法?您的意思是如果我添加了like.doOnError,或者像这里描述的那样-我添加了。您确定java
if(jobStores.get(id).equals(null))中的null检查就是这样做的吗
?Sagarr-不确定)我是初学者。您是否尝试过在服务类中处理错误,而不是重写存储库中的方法?您的意思是如果我添加了like.doon错误,或者像这里描述的那样-我添加了。您确定这就是java
if(jobStores.get(id).equals(null)中执行null检查的方式吗
?Sagarr-不确定)我是初学者。亲爱的Sagarr仍然有错误,但现在不同了:“com.javasampleapproach.webflux.Exception.ClientNotfoundException:null”和“jobStores.get(id)==null”我首先尝试过,很抱歉最初没有得到不同的错误。亲爱的Sagarr仍然有错误,但现在不同了:“com.javasampleapproach.webflux.Exception.ClientNotfoundException:null”和“jobStores.get(id)==null”我首先尝试了,抱歉没有得到最初不同的错误。亲爱的Thomas,在最后一行中,我得到了lambda类中的错误”。switchIfEmpty(Mono.error(ClientNotfoundException::new));“Throwable不是函数接口。“运行时或在编译时出错。因为在编译时它在我这端工作。当我编写代码类时-ClientNotfoundException加上红色下划线更准确地说-编译时出错”错误:(60,29)java:不兼容类型:java.lang.Throwable不是函数接口”关于上面提到的类。ClientNotfoundException.class是您的类吗?亲爱的Thomas,在最后一行中,我得到了lambda在类中的错误。switchIfEmpty(Mono.error(ClientNotfoundException::new));“Throwable不是函数接口。”运行时或在编译时出错。因为在编译时它在我这端工作。当我编写代码类时-ClientNotfoundException加上红色下划线更准确地说-编译时出错“错误:(60,29)java:不兼容类型:java.lang.Throwable不是函数接口”关于上面提到的class.ClientNotfoundException.class是你的类吗?
@Repository 
@Override
public Mono<JobClient> getJobById(Long id)  {
    return Optional.ofNullable(jobStore.get(id))
            .map(Mono::just)
            .orElseGet(Mono::empty);
}

//Then call it
getJobById(1L).map(jobClient -> ServerResponse.ok()
            .contentType(MediaType.APPLICATION_JSON)
            .syncBody(jobClient)
        ).switchIfEmpty(Mono.error(ClientNotfoundException::new));