Управление исключением NullPointer в SpringBoot Web-flux - PullRequest
1 голос
/ 12 октября 2019

Мой код вызывает элемент Mono из базы элементов Flux (уже создан). Включает класс @Repository с "getJobById" и класс @Component "Обработчик" для обработки запроса, такого как getAll, getJobById, post, put, delete. Если я введу неправильный идентификатор - не могу обработать исключение и получаю ошибку 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)));

Ответы [ 2 ]

0 голосов
/ 13 октября 2019

Вам необходимо отделить обычное программирование от реактивного программирования. Попробуйте это.

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

Havnt запустить код написал его на мобильном телефоне.

0 голосов
/ 12 октября 2019

Попробуйте это:

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