在RestAPI Spring应用程序中对可选项的最佳使用



我有点困惑,我应该如何设计存储库->服务→在我的RestAPI Spring应用程序中使用可选的控制器通信。例如,客户端希望通过id查找电影,但是电影不存在,并且存储库返回空可选。我有两种处理方法:

  1. Service方法返回可选值或抛出异常,该异常可以在Controller中使用ControllerAdvice处理。

  2. Service返回Optional, Controller处理它(如果存在返回值或处理异常,或者只是做其他事情)。

我知道在这种简单的情况下使用异常不是最佳实践,也许你可以建议其他方法让客户知道id是错误的。

方法在RestController当前:

@GetMapping("/{id}")
public FilmGetDto getFilm(@PathVariable int id) {
return filmService.getFilm(id);
}

我所遵循或看到人们遵循的大多数实践是您应该在服务中处理它并使用包装器类进行响应。通过这种方式,你将实现两件事,即你将有一个可以在所有应用程序中使用的恒定响应对象,你也可以很容易地使用异常等。您应该始终以MVC状态处理服务层中的任何业务逻辑。我在这里贴了一个例子,这样你就能更好地理解我在这里想说的。

控制器:

@GetMapping("/{id}")
public Response getFilm(@PathVariable int id) {
return filmService.getFilm(id);
}
服务:

public Response getFilm(int id){
Optional<Film> film = repo.findById(id);
return film.map(f -> Response.builder().status(200).data(f).message("request  successful"))
.orElseGet(() -> Response.builder().status(422).data(null).message("Film with given id not found");
}

和响应类与@Adrash建议的一样

class Response {
private int status;
private Object data;
private String message;

//you can use lombok or IDE  generate getter setters to generate getters setters
}

注意:我使用lombok builder方法在服务层创建响应对象

如果您想向客户端发送关于不存在此类id的消息,则必须处理此类边缘情况。也许你可以使用Optional来处理如果Optional . ispresent()返回false,你可以发送一个自定义的消息,让你的客户端知道没有数据存在这样的id。

您可以使用包装器类来实现这一点。

class ErrorResponse {
private String status;
private int statusCode;
private String message;
public ErrorResponse(String status, int statusCode, String message){
this.status = status;
-----
-----
}
}

设置这些字段并返回这个类对象作为响应。

你必须遵循标准,所以你不应该在控制器中编写代码,相反,你应该在服务中编写代码,而且,你可以将你的响应包装在一个类中,为它提供一个适当的自定义消息,以便它对客户端有意义。正如@Adarsh上面提到的包装器类,你可以创建完全相同的,它会解决你的问题。并遵循@Danish所提到的标准。

最新更新