抛出BadRequestException(ResponseEntity)与Catch错误,返回ResponseEntity(HTTPStatus.BadRequest)ReST API

时间:2019-09-26 21:05:37

标签: java api exception java-8 jax-rs

我正在重构一些代码,这是下面示例的较大比例。这些try / catch块使“ main”类非常混乱,并掩盖了代码的作用。

我不使用Spring,但使用JaxRs处理异常。这将是服务或控制器的ReST条目,但我们也在此处进行doa流程(我知道,但实际上是这样)。因此,我们需要返回带有所需信息的ResponseEntity。

public restVerifyName(userId) {
    String name;
    try {
        string name = nameProvider.getName(userId)
    } catch (exception A) {
        return new errorResponseBuilder(errorCode, errorMessage, status);
    } catch (exception B) {
        return new errorResponseBuilder(errorCode, errorMessage, status);
    }

    if (name == null) {
      return new errorResponseBuilder(errorCode, errorMessage, status);
     }

    try {
        nameAuthenticator.verifyName(name)
    } catch (Exception B) {
        return new errorResponseBuilder(errorCode, errorMessage, status);
    }
    Return Response.Ok().entity(name);
}

private errorResponseBuilder(errorCode, errorMessage, status) {
    ErrorResponse errorResponse = errorResponseBuilder(errorCode, errorMessage)
    return new Response.status(status).entity(errorResponse);
}

因此,我想将这些try / catches放入私有方法中,并进行更多自我记录。我的替代品大致是:

public restVerifyName() {
    String name = getName();
    if (!nameIsVerfied(name)  {
         return new errorResponseBuilder(errorCode, errorMessage);
    }
    Return Response.Ok().entity(name);
}

private String getName() {
    String name;
    try {
        name = nameProvider.getName()
    } catch (exception A) {
        return new errorResponseBuilder(errorCode, errorMessage);
    } catch (exception B) {
        return new errorResponseBuilderConflict(errorCode, errorMessage);
    }

    if (name == null) {
     return new errorResponseBuilderConflict(errorCode, errorMessage);
    }
    return name;
}

private boolean verifyName(name) {
    try {
        return nameAuthenticator.verifyName(name)
    } catch (Exception B) {
        return new errorResponseBuilderBadRequest(errorCode, errorMessage);
    }
    return false;
}


private errorResponseBuilderBadRequest(errorCode, errorMessage) {
    ErrorResponse errorResponse = errorResponseBuilder(errorCode, errorMessage)
    ResponseEntity response = Response.status(status).entity(errorResponse)
    throw new BadRequestException(response)
}

private errorResponseBuilderConflict(errorCode, errorMessage) {
    ErrorResponse errorResponse = errorResponseBuilder(errorCode, errorMessage)
    ResponseEntity response = Response.status(status).entity(errorResponse)
    throw new ConfictException(response)
}

在两个站中返回的响应完全相同。

不管是否存在逻辑错误/格式等。哪种通用方法是最佳实践?在响应中引发异常或返回响应(在此示例中重构目标)

这是更大范围的尝试,也有一些尝试,因此我觉得从'main'类中消除混乱更为可读。是否对带有responseEntities的异常抛出异常并让JaxRs皱眉呢?

谢谢

1 个答案:

答案 0 :(得分:0)

一般方法是使用必要的嵌入详细信息引发异常。

然后有一个全局异常处理程序,将异常转换为响应。

对于Jax-RS,您可以使用ExceptionMapper来捕获异常。

private String getName() {
    String name;
    //try {
        name = nameProvider.getName()
    // Only catch if exception is a checked exception or you need to transform the exception to another type with embedded detail
    // Runtime exception should generally not need to be caught here
    //} catch (exception A) {
    //    return new errorResponseBuilder(errorCode, errorMessage);
    //} catch (exception B) {
    //    return new errorResponseBuilderConflict(errorCode, errorMessage);
    //}

    if (name == null) {
       throw new ACustomErrorExceptionForThisKind(name);
    }
    return name;
}

public class ACustomErrorExceptionForThisKindMapper implements ExceptionMapper<E extends Throwable> {
   public Response toResponse(ACustomErrorExceptionForThisKind e) {
        ....
   }
}