RxJava-Spring引导中的全局错误处理

RxJava-Spring引导中的全局错误处理,spring,rx-java2,Spring,Rx Java2,我的服务方式: public Single<AuthenticationResponse> askForToken(UserRequest user){ return Maybe.fromCallable(()-> Unirest.post("https://lawyers-supervisor.eu.auth0.com/oauth/token") .header("content-type", "appl

我的服务方式:

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());
            });
}
publicssingleaskfortoken(UserRequest用户){
返回Maybe.fromCallable(()->
Unirest.post(“https://lawyers-supervisor.eu.auth0.com/oauth/token")
.header(“内容类型”、“应用程序/json”)
.body(String.format(“{\”授予\类型\“:\”密码\“,”+
“\'username\':\%s\,”+
“\'password\':\%s\,”+
“\“观众\”:\%s\,”+
“范围”:“脱机访问”+
“客户端id\:\%s\,”+
“\'client\u secret\”:\%s\“}”,
user.getEmail(),
user.getPassword(),
观众
clientId,
客户机密)
.asJson())
.flatMapSingle(httpResponse->{
UserEntity UserEntity=userService.getByEmail(user.getEmail()).blockingGet();
if(Objects.isNull(userEntity))
.error(new UserNotExistsException());
如果(httpResponse.getStatus()!=HttpStatus.SC\u确定)
可能是。错误(新的AuthenticationException());
返回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;
}
@RestControllerAdvice
公共类GlobalExceptionHandler扩展ResponseEntityExceptionHandler实现ErrorController{
@ExceptionHandler(UserDuplicateEmailException.class)
公共响应处理的DuplicateDeMaileException(UserDuplicateEmailException ex,WebRequest请求){
HttpStatus status=HttpStatus.CONFLICT;
return handleExceptionInternal(例如,new ErrorTemplate(status,status.value()),
具有电子邮件的用户:“+ex.getEmail()+”已存在于数据库中”,
例如,getMessage(),
新的时间戳(System.currentTimeMillis()),
新的HttpHeaders(),状态,请求);
}
@ExceptionHandler(AuthenticationException.class)
公共响应handleAuthenticationException(AuthenticationException ex,WebRequest请求){
HttpStatus status=HttpStatus.UNAUTHORIZED;
return handleExceptionInternal(例如,new ErrorTemplate(status,status.value()),
“密码或电子邮件错误”,
无效的
新的时间戳(System.currentTimeMillis()),
新的HttpHeaders(),状态,请求);
}
@ExceptionHandler(UserNotExistsException.class)
public ResponseEntity UserNotexistException(身份验证异常ex,WebRequest请求){
HttpStatus status=HttpStatus.UNAUTHORIZED;
return handleExceptionInternal(例如,new ErrorTemplate(status,status.value()),
“用户不存在”,
无效的
新的时间戳(System.currentTimeMillis()),
新的HttpHeaders(),状态,请求);
}
@凌驾
公共字符串getErrorPath(){
返回“错误”;
}
@凌驾
public final ResponseEntity handleMissingServletRequestParameter(MissingServletRequestParameterException ex,HttpHeaders标头,HttpStatus状态,WebRequest请求){
返回null;
}
@凌驾
受保护的响应HandleHttpMessageGenetradable(HttpMessageGenetradableException ex,HttpHeaders
标题、HttpStatus状态、WebRequest请求){
返回null;
}
@凌驾
受保护的响应handleHttpRequestMethodNotSupported(HttpRequestMethodNotSupportedException ex、HttpHeaders标头、HttpStatus状态、WebRequest请求){
返回null;
}
}

问题是,即使条件已满并且可能命中了.error(…),我的全局hanlder也不会处理该错误。我想知道我错过了什么,为什么会这样?我不知道这是由handler还是rxJava引起的。也许我错过了一些重要的事情

Maybe.error(新的AuthenticationException())-这只会创建一个新的
对象,然后丢弃该对象。您需要返回它以传播错误