1. Введение
❝Прошлый обзор:
❞
- Практическое обучение Spring Boot (1): как создать красивый начальный баннер.txt
- Практическое обучение Spring Boot (2): используйте конфигурацию yml для нескольких сред и создайте упаковку профиля для нескольких сред.
- Практическое обучение Spring Boot (3): настройка журналов журналов с нуля
- Весенние ботинки для обучения (4): генератор кода MyBatis-Plus, автоматически генерирует код для вас
- Исследования весенних ботинок Shoubashoujiao (5): время выполнения задачи
- Практическое обучение Spring Boot (6): отправка электронных писем
- Практическое обучение Spring Boot (7): Откажитесь от try-catch, как изящно и единообразно обрабатывать исключения (включая обработку 404)
На данный момент написано семь статей о загрузке Spring, большинство из которых посвящены некоторым базовым службам настройки.
В реальных проектах многие коллеги всегда игнорируют построение базовых проектов, думая, что базовое построение проектов не важно, и не важно писать бизнес-код.
Я лично считаю, что базовые сервисы тоже очень важны.Это накопление знаний сверху донизу в целом.Бизнес-код CRUD, и после его написания возможности улучшаться не так много.
Написание статьи может быть немного грубым, пожалуйста, не обращайте на это внимания. Если вам это не нравится, не распыляйте его. Добро пожаловать в дополнительные рекомендации.
Не так много ерунды,
Верните инкапсуляцию класса сущностей, которая будет кратко представлена сегодня.
2. Вернуть класс сущности
❝Инкапсуляция результатов ответов унифицированного API: com.scaffold.test.base.Result
❞
package com.scaffold.test.base;
import lombok.Data;
/**
* 统一API响应结果封装
*/
@Data
public class Result {
private int code;
private String message = "success";
private Object data;
// 后面result生成器需要以下方法
public Result setCode(ResultCode resultCode){
this.code = resultCode.code;
return this;
}
public Result setMessage(String message){
this.message = message;
return this;
}
public Result setData(Object data){
this.data = data;
return this;
}
}
Здесь мы используемlombok
, @Data
Аннотация, упрощающая класс сущностейGetter
иSetter
;
<!-- lombok 简化代码-->
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<optional>true</optional>
</dependency>
В реальном проекте:
в целомResponse
Содержит три KEY s:code、message 和 data
, соглашение о фиксированной структуре данных, которое удобно для совместной отладки и тестирования с другими коллегами.
❝❞
1. code
❝
HTTP状态码(500 Server Error, 404 Not Fund 等等 1XX,2XX,3XX,4XX,5XX的各类错误 )
Существуют также некоторые нестандартные коды состояния, настроенные бизнес-системой, такие как 000000, 999999, которые запутаны, и рекомендуется использовать стандарт;
❞
❝❞
HTTP 状态码大全
:
1 消息 ▪ 100 Continue ▪ 101 Switching Protocols ▪ 102 Processing
2 成功 ▪ 200 OK ▪ 201 Created ▪ 202 Accepted ▪ 203 Non-Authoritative Information ▪ 204 No Content ▪ 205 Reset Content ▪ 206 Partial Content ▪ 207 Multi-Status
3 重定向 ▪ 300 Multiple Choices ▪ 301 Moved Permanently ▪ 302 Move Temporarily ▪ 303 See Other ▪ 304 Not Modified ▪ 305 Use Proxy ▪ 306 Switch Proxy ▪ 307 Temporary Redirect
4 请求错误 ▪ 400 Bad Request ▪ 401 Unauthorized ▪ 402 Payment Required ▪ 403 Forbidden ▪ 404 Not Found ▪ 405 Method Not Allowed ▪ 406 Not Acceptable ▪ 407 Proxy Authentication Required ▪ 408 Request Timeout ▪ 409 Conflict ▪ 410 Gone ▪ 411 Length Required ▪ 412 Precondition Failed ▪ 413 Request Entity Too Large ▪ 414 Request-URI Too Long ▪ 415 Unsupported Media Type ▪ 416 Requested Range Not Satisfiable ▪ 417 Expectation Failed ▪ 418 I'm a teapot ▪ 421 Misdirected Request ▪ 422 Unprocessable Entity ▪ 423 Locked ▪ 424 Failed Dependency ▪ 425 Too Early ▪ 426 Upgrade Required ▪ 449 Retry With ▪ 451 Unavailable For Legal Reasons
5 服务器错误 ▪ 500 Internal Server Error ▪ 501 Not Implemented ▪ 502 Bad Gateway ▪ 503 Service Unavailable ▪ 504 Gateway Timeout ▪ 505 HTTP Version Not Supported ▪ 506 Variant Also Negotiates ▪ 507 Insufficient Storage ▪ 509 Bandwidth Limit Exceeded ▪ 510 Not Extended ▪ 600 Unparseable Response Headers
❝❞
2. data
❝Возвращаемые данные — это данные, которые нам нужны, будь то список или карта, они возвращаются здесь;
❞
// 查询所有
@GetMapping("/list")
public Result getList() {
Result result;
List<Job> jobList = jobService.findAll();
result = ResultResponse.getSuccessResult(jobList);
return result;
}
❝❞
3. message
❝сообщение-это быстрый возврат, чтобы сделать быстрый и дружелюбный
❞
3. Перечисление пользовательского кода ответа
❝com.scaffold.test.base.ResultCode
❞
package com.scaffold.test.base;
/**
* 响应码枚举,对应HTTP状态码
*/
public enum ResultCode {
SUCCESS(200),//成功
FAIL(400),//失败
UNAUTHORIZED(401),//未认证(签名错误)
NOT_FOUND(404),//接口不存在
INTERNAL_SERVER_ERROR(500);//服务器内部错误
public int code;
ResultCode(int code) {
this.code = code;
}
}
4. Класс генерации результата ответа
package com.scaffold.test.base;
/**
* 响应结果封装
*/
public class ResultResponse {
private static final String DEFAULT_SUCCESS_MESSAGE = "SUCCESS";
// 只返回状态
public static Result getSuccessResult() {
return new Result()
.setCode(ResultCode.SUCCESS)
.setMessage(DEFAULT_SUCCESS_MESSAGE);
}
// 成功返回数据
public static Result getSuccessResult(Object data) {
return new Result()
.setCode(ResultCode.SUCCESS)
.setMessage(DEFAULT_SUCCESS_MESSAGE)
.setData(data);
}
// 失败
public static Result getFailResult(String message) {
return new Result()
.setCode(ResultCode.FAIL)
.setMessage(message);
}
}
Здесь есть три метода состояния, которых, вероятно, достаточно;
❝Первое, нет необходимости возвращать данные, такие как только статус запроса.
❞
// 无需data
@GetMapping("/status")
public Result status() {
// 模拟无需data
return ResultResponse.getSuccessResult();
}
❝Во-вторых, запрос на получение данных выполнен успешно.
❞
// 查询所有
@GetMapping("/list")
public Result getList() {
Result result;
List<Job> jobList = jobService.findAll();
result = ResultResponse.getSuccessResult(jobList);
return result;
}
❝В-третьих, запросить информацию о сбое.
❞
// 错误
@GetMapping("/err")
public Result err() {
// 模拟错误
return ResultResponse.getFailResult("模拟错误");
}
5. Полный код
❝com.scaffold.test.base.Result: инкапсуляция результатов ответов унифицированного API.
❞
package com.scaffold.test.base;
import com.fasterxml.jackson.databind.annotation.JsonSerialize;
import lombok.Data;
/**
* 统一API响应结果封装
*/
@Data
// 非空返回
@JsonSerialize(include = JsonSerialize.Inclusion.NON_NULL)
public class Result {
private int code;
private String message = "success";
private Object data;
public Result setCode(ResultCode resultCode){
this.code = resultCode.code;
return this;
}
public Result setMessage(String message){
this.message = message;
return this;
}
public Result setData(Object data){
this.data = data;
return this;
}
}
❝com.scaffold.test.base.ResultCode: перечисление кода ответа
❞
package com.scaffold.test.base;
/**
* 响应码枚举,参考HTTP状态码的语义
*/
public enum ResultCode {
SUCCESS(200),//成功
FAIL(400),//失败
UNAUTHORIZED(401),//未认证(签名错误)
NOT_FOUND(404),//接口不存在
INTERNAL_SERVER_ERROR(500);//服务器内部错误
public int code;
ResultCode(int code) {
this.code = code;
}
}
❝com.scaffold.test.base.ResultResponse
❞
package com.scaffold.test.base;
/**
* 响应结果生成工具
*/
public class ResultResponse {
private static final String DEFAULT_SUCCESS_MESSAGE = "SUCCESS";
// 只返回状态
public static Result getSuccessResult() {
return new Result()
.setCode(ResultCode.SUCCESS)
.setMessage(DEFAULT_SUCCESS_MESSAGE);
}
// 成功返回数据
public static Result getSuccessResult(Object data) {
return new Result()
.setCode(ResultCode.SUCCESS)
.setMessage(DEFAULT_SUCCESS_MESSAGE)
.setData(data);
}
// 失败
public static Result getFailResult(String message) {
return new Result()
.setCode(ResultCode.FAIL)
.setMessage(message);
}
}
❝com.scaffold.test.controller.JobController
❞
package com.scaffold.test.controller;
import com.scaffold.test.base.Result;
import com.scaffold.test.base.ResultResponse;
import com.scaffold.test.base.ServiceException;
import com.scaffold.test.entity.Job;
import com.scaffold.test.service.JobService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
import java.util.List;
/**
* <p>
* 前端控制器
* </p>
*
* @author alex wong
* @since 2020-06-14
*/
@RestController
@RequestMapping("/job")
public class JobController {
@Autowired
private JobService jobService;
// 查询所有
@GetMapping("/list")
public Result getList() {
Result result;
List<Job> jobList = jobService.findAll();
result = ResultResponse.getSuccessResult(jobList);
return result;
}
// 错误
@GetMapping("/err")
public Result err() {
// 模拟错误
return ResultResponse.getFailResult("模拟错误");
}
// 无需data
@GetMapping("/status")
public Result status() {
// 模拟无需data
return ResultResponse.getSuccessResult();
}
}
В этой статье используетсяmdniceнабор текста