- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在重构一些代码,这是下面示例的更大范围。 “主”类中充满了这些 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/
我即将实现一个 REST api。我想知道 HttpStatus.OK 和 HttpStatus.ACCEPTED 之间有什么区别: return new ResponseEntity(u, Http
我想处理服务器错误的特殊情况,即HttpStatus代码599。但是,这个代码没有在Spring内置的HttpStatus类中定义。对于 HttpStatus 类中定义的所有其他代码,我曾经通过以下代
我想返回,响应中的 555 状态代码。 我检查了spring框架的ResponseEntity类。 我可以看到所有构造函数仅接受 HttpStatus 枚举中的特定代码。这可以通过以下方式实现, re
我正在使用拦截器来转换我的响应。我想设置HttpStatus在里面,但我现在使用的代码不起作用。 import { CallHandler, ExecutionContext, NestInterce
假设我开发了一些 rest api。我有网络层( Controller )和服务层(模型)。在服务层使用 HttpStatus 代码抛出异常是好习惯吗? 有人会说,那个模型应该对web层一无所知,不应
我正在尝试使用 DownloadData 方法使用 RestSharp 下载文件(图像) var client = new RestClient(baseUrl); var request = new
我有一个 spring 集成 http 入站网关。我想在不同的使用情况下返回特定的 http 状态代码。 有没有办法在响应中指定 httpStatus ??? 我尝试使用 异常类型路由器,其中每个异常
我想测试当我调用这样的方法时是否会引发自定义异常: private MyObject queryDatabase(String request, String end){ HttpEntity
我有一个应用程序,我在其中使用 ResponseEntity 从我的 Controller 返回动态 HttpStatus 代码 return new ResponseEntity("Unrecogn
我在异常中使用 Spring 注释 @ResponseStatus @ResponseStatus(value=HttpStatus.UNAUTHORIZED) public class Unauth
我创建了一个 AppErrorController,它扩展了 Boot 的 ErrorController 以处理 status500 错误。示例: @Controller public class
我已经实现了一个符合 Snowflake's Asynchronous External Function. 的 API 在我们开发的系统中,我们使用 AWS API 网关、Lambda 函数和第三方
我使用spring开发rest服务很长时间了,到目前为止我返回http状态代码的方法是这样的: @RequestMapping(value = "/sth") public void
当端点调用失败时,我尝试返回不同的错误代码,并使用 HttpStatuses 作为响应。 现在我正在测试端点定义: @PostMapping("shredding_type/update")
关闭。这个问题是opinion-based .它目前不接受答案。 想要改进这个问题? 更新问题,以便 editing this post 可以用事实和引用来回答它. 关闭 5 年前。 Improve
我正在使用 Spring Boot 构建应用程序。此应用程序是分布式的,这意味着我有多个相互调用的 API。 我的一项底层服务与数据库交互并响应请求的数据。如果发出对不存在的 ID 的请求,我将使用
这个问题在这里已经有了答案: WEBrick: RequestURITooLarge: should I update or use a different server? (3 个答案) 关闭 5
我正在使用 spring MVC 创建 Rest Web 服务。并希望发送 213 代码状态作为响应。但此代码不存在于类 org.springframework.http.HttpStatus 中,并
使用org.apache.http与 org.apache.httpcomponents httpclient 4.5.2 描述端点上的 swagger 配置(不过,这不仅仅是库
我有一个 spring mvc Controller ,它生成一个“application/pdf”来下载生成的 pdf。我想始终返回 pdf,并根据某些条件返回不同的 HTTP 代码。 我尝试返回
我是一名优秀的程序员,十分优秀!