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())代码>-这只会创建一个新的对象,然后丢弃该对象。您需要返回它以传播错误