在我的Sping Boot 应用中,我只是第一次使用Optional
,在检查了几个项目和主题之后,现在我尝试构建一种方法,如下所示:
存储库:
Optional<Employee> findByEmail(String email);
服务:
public Response findByEmail(String email) {
return employeeRepository.findByEmail(email)
// if record is found, I think no need to return status or message
.map(e -> Response.builder().data(e).build())
.orElseGet(() -> Response.builder().status(404)
.data(null).message("Not found!").build());
}
回应:
@Data
@Builder
public class Response {
private int status;
private Object data;
private String message;
}
控制器:
@GetMapping("/employees/{email}")
public ResponseEntity<Response> findByEmail(@PathVariable String email) {
final Response response = employeeService.findByEmail(email);
return ResponseEntity
.status(response.getStatus())
.body(response.getMessage(), response.getData());
// throws "Expected 1 arguments but found 2" error
}
以下是我需要澄清的几点:
**1.**这是对Sping Boot 应用中的所有Optional
类型使用通用响应的正确方法吗?如果不是,我应该如何更改它(我希望从服务返回通用响应)?
**2.**如何修复控制器中的 throws“预期1个参数,但找到2个” 错误?
1条答案
按热度按时间eiee3dmh1#
从我上面的评论来看- * 你在混淆关注点。服务应该只关心业务逻辑(例如,不是HTTP状态代码)。这是控制器的工作。Optional的使用是正确的,但是来自服务层的Response返回类型不是这样的。同样,如果资源没有找到,类似Not Found的错误会由Sping Boot 中的Rest Controller自动处理。如果您希望添加自定义逻辑并准备通用响应,请包含适当的异常处理,例如@ControllerAdvice(它允许您重用控制器的异常)。*
例如,其中一个解决方案是抛出
NoSuchElementException
。这是说明性的,如果你想以通用的方式处理其他类似的情况(例如空指针、内部服务器错误、以更自定义的方式验证错误),这也适用。在@控制器建议类内部