【问题标题】:Managing NullPointer Exception in SpringBoot Web-flux在 Spring Boot Webflux 中管理 NullPointerException
【发布时间】: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


【解决方案1】:

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

@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));

不要运行在移动设备上编写的代码。

【讨论】:

  • 亲爱的 Thomas,在最后一行中,我在 lambda ".switchIfEmpty(Mono.error(ClientNotfoundException::new));" 的类中遇到错误“Throwable 不是功能接口。”
  • 运行或编译时出错。因为在编译期间它对我有用。
  • 当我写了一个代码 - 类 ClientNotfoundException 用红色下划线
  • 更准确地说 - 编译时出错 "Error:(60, 29) java: incompatible types: java.lang.Throwable is not a functional interface" 和上面提到的类。
  • ClientNotfoundException.class 是你的班级吗?
【解决方案2】:

试试这个:

@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)));
}

在 java 中,你可以避免NullPointerException,首先检查给定对象是否为空,然后继续调用它的方法

if (obj != null) {
    obj.doSomething();
}

【讨论】:

  • 亲爱的 Sagarr 仍然错误,但现在不同了:“com.javasampleapproach.webflux.Exception.ClientNotfoundException: null”和“jobStores.get(id) == null”我先尝试了,抱歉没有t 得到最初的不同错误。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-11-05
  • 2018-08-24
  • 2021-07-16
  • 2022-12-22
  • 2020-11-10
  • 1970-01-01
  • 2018-10-11
相关资源
最近更新 更多