2017-09-02 9 views
0

マイサービス方法:RxJava-グローバルエラー

public Single<AuthenticationResponse> askForToken(UserRequest user){ 
    return Maybe.fromCallable(()-> 
      Unirest.post("https://lawyers-supervisor.eu.auth0.com/oauth/token") 
        .header("content-type", "application/json") 
        .body(String.format("{\"grant_type\": \"password\","+ 
            "\"username\": \"%s\","+ 
            "\"password\": \"%s\","+ 
            "\"audience\": \"%s\","+ 
            "\"scope\": \"offline_access\","+ 
            "\"client_id\":\"%s\","+ 
            "\"client_secret\": \"%s\" }", 
          user.getEmail(), 
          user.getPassword(), 
          audience, 
          clientId, 
          clientSecret)) 
        .asJson()) 
      .flatMapSingle(httpResponse->{ 
       UserEntity userEntity=userService.getByEmail(user.getEmail()).blockingGet(); 
       if(Objects.isNull(userEntity)) 
        Maybe.error(new UserNotExistsException()); 
       if(httpResponse.getStatus() != HttpStatus.SC_OK) 
        Maybe.error(new AuthenticationException()); 
       return Mapper.mapHttpResponseToAuthenticationResponse(httpResponse,user.getEmail(),userEntity.getUserId(),userEntity.getRole()); 
      }); 
} 

グローバル例外ハンドラ:

@RestControllerAdvice 
public class GlobalExceptionHandler extends ResponseEntityExceptionHandler implements ErrorController { 

@ExceptionHandler(UserDuplicateEmailException.class) 
public ResponseEntity<Object> handleDuplicatedEmailEexception(UserDuplicateEmailException ex, WebRequest request) { 
    HttpStatus status = HttpStatus.CONFLICT; 
    return handleExceptionInternal(ex, new ErrorTemplate(status, status.value(), 
        "User with email :" + ex.getEmail() + " already exists in database", 
        ex.getMessage(), 
        new Timestamp(System.currentTimeMillis())), 
      new HttpHeaders(), status, request); 
} 

@ExceptionHandler(AuthenticationException.class) 
public ResponseEntity<Object> handleAuthenticationException(AuthenticationException ex, WebRequest request) { 
    HttpStatus status = HttpStatus.UNAUTHORIZED; 
    return handleExceptionInternal(ex, new ErrorTemplate(status, status.value(), 
        "Bad password or email", 
        null, 
        new Timestamp(System.currentTimeMillis())), 
      new HttpHeaders(), status, request); 
} 

@ExceptionHandler(UserNotExistsException.class) 
public ResponseEntity<Object> userNotExistsException(AuthenticationException ex, WebRequest request) { 
    HttpStatus status = HttpStatus.UNAUTHORIZED; 
    return handleExceptionInternal(ex, new ErrorTemplate(status, status.value(), 
        "User doesn't exists", 
        null, 
        new Timestamp(System.currentTimeMillis())), 
      new HttpHeaders(), status, request); 
} 
@Override 
public String getErrorPath() { 
    return "error"; 
} 

@Override 
public final ResponseEntity<Object> handleMissingServletRequestParameter(MissingServletRequestParameterException ex, HttpHeaders headers, HttpStatus status, WebRequest request) { 
    return null; 
} 

@Override 
protected ResponseEntity<Object> handleHttpMessageNotReadable(HttpMessageNotReadableException ex, HttpHeaders 
     headers, HttpStatus status, WebRequest request) { 
    return null; 
} 

@Override 
protected ResponseEntity<Object> handleHttpRequestMethodNotSupported(HttpRequestMethodNotSupportedException ex, HttpHeaders headers, HttpStatus status, WebRequest request) { 
    return null; 
} 

}

問題があっても条件がfullfilledされていることで、たぶん.error(...)がヒットした場合、エラーはグローバルハンドルでは処理されません。私は何が逃したのか、それがどうして起こるのだろうか?私はそれがハンドラかrxJavaによって引き起こされたかどうかわかりません。たぶん私は重要だと思った。

答えて

0

Maybe.error(new AuthenticationException()); - これは新しいMaybeオブジェクトを作成するだけで、破棄されます。エラーを伝播させるには、それを戻す必要があります。

関連する問題