2022 就业季|Spring 认证教你,如何使用 Spring 构建 REST 服务 (二)
书接上文⬆⬆⬆
HTTP 是平台
要使用 Web 层次包装您的存储库,您必须使用 Spring MVC。多亏了 Spring Boot,代码基础设施很少。相反,我们可以专注于行动:
nonrest/src/main/java/payroll/EmployeeController.java
package payroll;
import java.util.List;
import org.springframework.web.bind.annotation.DeleteMapping;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.PutMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RestController;
@RestController
class EmployeeController {
private final EmployeeRepository repository;
EmployeeController(EmployeeRepository repository) {
this.repository = repository;
}
// Aggregate root
// tag::get-aggregate-root[]
@GetMapping("/employees")
List<Employee> all() {
return repository.findAll();
}
// end::get-aggregate-root[]
@PostMapping("/employees")
Employee newEmployee(@RequestBody Employee newEmployee) {
return repository.save(newEmployee);
}
// Single item
@GetMapping("/employees/{id}")
Employee one(@PathVariable Long id) {
return repository.findById(id)
.orElseThrow(() -> new EmployeeNotFoundException(id));
}
@PutMapping("/employees/{id}")
Employee replaceEmployee(@RequestBody Employee newEmployee, @PathVariable Long id) {
return repository.findById(id)
.map(employee -> {
employee.setName(newEmployee.getName());
employee.setRole(newEmployee.getRole());
return repository.save(employee);
})
.orElseGet(() -> {
newEmployee.setId(id);
return repository.save(newEmployee);
});
}
@DeleteMapping("/employees/{id}")
void deleteEmployee(@PathVariable Long id) {
repository.deleteById(id);
}
}
@RestController 表示每个方法返回的数据会直接写入响应体,而不是渲染模板。
AnEmployeeRepository 由构造函数注入到控制器中。
我们有每个操作的路由(@GetMapping、@PostMapping、@PutMapping 和 @DeleteMapping,对应于 HTTP GET、POST、PUT 和 DELETE 调用)。(注意:阅读每种方法并了解它们的作用很有用。)
EmployeeNotFoundException 是用于指示何时查找但未找到员工的异常。
nonrest/src/main/java/payroll/EmployeeNotFoundException.java
package payroll;
class EmployeeNotFoundException extends RuntimeException {
EmployeeNotFoundException(Long id) {
super("Could not find employee " + id);
}
}
当 EmployeeNotFoundException 抛出 an 时,Spring MVC 配置的这个额外花絮用于呈现 HTTP 404:
nonrest/src/main/java/payroll/EmployeeNotFoundAdvice.java
package payroll;
import org.springframework.http.HttpStatus;
import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.bind.annotation.ResponseStatus;
@ControllerAdvice
class EmployeeNotFoundAdvice {
@ResponseBody
@ExceptionHandler(EmployeeNotFoundException.class)
@ResponseStatus(HttpStatus.NOT_FOUND)
String employeeNotFoundHandler(EmployeeNotFoundException ex) {
return ex.getMessage();
}
}
@ResponseBody 表示此建议直接呈现到响应正文中。
@ExceptionHandlerEmployeeNotFoundException 将建议配置为仅在抛出 an 时才响应。
@ResponseStatus 说要发出一个 HttpStatus.NOT_FOUND,即一个 HTTP 404。
建议的主体生成内容。在这种情况下,它会给出异常的消息。
要启动应用程序,请右键单击其中并从 IDEpublic static void main 中 PayRollApplication 选择运行,或者:
Spring Initializr 使用 maven 包装器,所以输入:
或者使用您安装的 Maven 版本输入:
当应用程序启动时,我们可以立即对其进行询。
这将产生:
在这里,您可以看到压缩格式的预加载数据。
如果您尝试查询一个不存在的用户......
你得到…
此消息很好地显示了 HTTP 404 错误以及自定义消息 Could not find employee 99。
显示当前编码的交互并不难……
如果您使用 Windows 命令提示符发出 cURL 命令,则以下命令可能无法正常工作。您必须选择一个支持单引号参数的终端,或者使用双引号,然后转义 JSON 中的那些。
要创建新 Employee 记录,我们在终端中使用以下命令——$开头的表示后面是终端命令:
然后它存储新创建的员工并将其发送回给我们:
您可以更新用户。让我们改变他的角色。
我们可以看到输出中反映的变化。
您构建服务的方式可能会产生重大影响。在这种情况下,我们说 update,但 replace 是更好的描述。例如,如果未提供名称,则它将被取消。
最后,您可以像这样删除用户:
这一切都很好,但是我们有 RESTful 服务了吗?(如果你没有听懂提示,答案是否定的。)
少了什么东西?
......未完待续......
以上就是今天关于 Spring 的一些讨论,对你有帮助吗?如果你有兴趣深入了解,欢迎到 Spring 中国教育管理中心留言交流!
评论