gpt4 book ai didi

java - 抛出 BadRequestException(ResponseEntity) 与捕获错误,返回 ResponseEntity(HTTPStatus.BadRequest) ReST API

转载 作者:行者123 更新时间:2023-12-02 00:10:34 30 4
gpt4 key购买 nike

我正在重构一些代码,这是下面示例的更大范围。 “主”类中充满了这些 try/catch block ,并且模糊了代码正在执行的操作。

我没有使用 Spring,而是使用 JaxRs 来处理异常。这将是服务或 Controller 的 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/catch 放入私有(private)方法中,并使其更加 self 记录。我的替代品大致是:

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)
}

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

无论任何逻辑错误/格式等,哪种通用方法是最佳实践?通过响应抛出异常,或返回响应(在本示例重构目标的上下文中)

这是一个更大的规模,有更多的尝试/捕获,所以我觉得从“主”类中消除困惑更具可读性。使用responseEntities抛出异常并让JaxRs处理它是否令人不悦?

谢谢

最佳答案

一般方法是抛出带有必要嵌入细节的异常。

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

对于 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) {
....
}
}

关于java - 抛出 BadRequestException(ResponseEntity) 与捕获错误,返回 ResponseEntity(HTTPStatus.BadRequest) ReST API,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58124779/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com