Java 抛出BadRequestException(ResponseEntity)vs捕获错误,返回ResponseEntity(HTTPStatus.BadRequest)ReST API
我正在重构一些代码,这是下面示例的较大规模。“main”类被这些try/catch块弄得乱七八糟,并且模糊了代码的作用 我不是在使用Spring,而是在使用JAXR处理异常。这将是服务或控制器的ReST入口,但我们也在这里执行doa过程(我知道,但只是它是如何完成的)。所以我们需要返回一个带有所需信息的ResponseEntityJava 抛出BadRequestException(ResponseEntity)vs捕获错误,返回ResponseEntity(HTTPStatus.BadRequest)ReST API,java,api,exception,java-8,jax-rs,Java,Api,Exception,Java 8,Jax Rs,我正在重构一些代码,这是下面示例的较大规模。“main”类被这些try/catch块弄得乱七八糟,并且模糊了代码的作用 我不是在使用Spring,而是在使用JAXR处理异常。这将是服务或控制器的ReST入口,但我们也在这里执行doa过程(我知道,但只是它是如何完成的)。所以我们需要返回一个带有所需信息的ResponseEntity public restVerifyName(userId) { String name; try { string name = na
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引入到私有方法中,并让它们更加自我记录。我的替代者大致如下:
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)
}
两个站点返回的响应完全相同
无论任何逻辑错误/格式等,哪种通用方法是最佳实践?抛出带有响应的异常,或返回响应(在本示例中为重构目标)
这是一个更大的规模,还有一些try/catch,所以我觉得从“main”类中删除杂乱内容更具可读性。抛出带有responseEntities的异常并让JAXR来处理它是不受欢迎的吗
谢谢一般的方法是抛出带有必要嵌入细节的异常 然后使用全局异常处理程序将异常转换为响应 对于Jax-RS,您可以使用它捕获异常
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) {
....
}
}
私有字符串getName(){
字符串名;
//试一试{
name=nameProvider.getName()
//仅当异常是选中的异常或需要将异常转换为具有嵌入详细信息的其他类型时才捕获
//通常不需要在此处捕获运行时异常
//}捕获(例外A){
//返回新的errorResponseBuilder(errorCode,errorMessage);
//}捕获(例外B){
//返回新的errorResponseBuilderConflict(errorCode,errorMessage);
//}
if(name==null){
为该种类(名称)抛出新的Acustomer或Exception;
}
返回名称;
}
此KindMapper的公共类AcustomerRorException实现ExceptionMapper{
公众对响应的响应(此类事件的敏感或例外){
....
}
}
这是一个广泛的问题。如果这些异常是“您的”自定义异常,您可以考虑将它们设为未检查的异常,如果您确实必须处理这些异常,我会考虑从Scala或java的Vavr库中知道更为现代的方法-尝试容器保存结果或异常。@ JAROSCALJ道歉。目标是返回一些Http响应,无论是2xx还是4xx。所以,如果有什么东西在任何时候坏了,就退出它,然后返回响应。我想尝试隐藏一些try容器,如果我在第二个示例周围放置另一个,感觉就像我为了捕捉而捕捉?