以前にも一連の記事を公開しました。Restful API へのグローバル応答を封印する方法を説明します。
興味があれば、私の以前の記事 (スターター プロジェクトの開発履歴全体) を読んでください。
SpringBoot は、エレガントでグローバルに統合された Restful API 応答フレームワークを定義します
SpringBoot は、エレガントでグローバルに統合された Restful API 応答フレームワークを定義します 2
SpringBoot は、エレガントでグローバルに統合された Restful API 応答フレームワークを定義します 3
SpringBoot は、エレガントでグローバルに統合された Restful API 応答フレームワークを定義します。
SpringBoot はエレガントなグローバル統合 Restful API 応答フレームワークを定義します 5
SpringBoot はエレガントなグローバル統合 Restful API 応答フレームワークを定義します 6
その後、SpringBoot は独自のスターターを提供しないという新しいアイデアを思いつきました。starterもカスタマイズできるので、rest-api-spring-boot-starterを定義しました。これは Maven 中央ウェアハウスにリリースされており、以前の Restful API 応答フレームワークを統合およびリファクタリングしています。
これに基づいて、私自身の仕事で一般的に使用される多くのツールを要約してカプセル化し、SpringBoot と組み合わせて万能のツールをカプセル化しました。依存関係を結合せずに 1.3.0 に更新されました。最新バージョンを使用してください。
現在更新されたバージョン1.3.0の機能は次のとおりです。
- RestFull API の均一な形式の戻り値をカスタマイズするためのワンクリック構成のサポート
- RestFull API エラーの国際化をサポート
- グローバル例外処理、グローバルパラメータ検証処理をサポート
- 最初にエラーを返すという原則に従って、ビジネス エラー アサーション ツールをカプセル化します。
- Redis 作業パッケージ。すべての主要な操作ツールをサポート
- RestTemplate は POST、GET リクエスト ツールをカプセル化します
- ログの統合。ログ パスをカスタマイズし、ログ レベルに従って分類し、圧縮とファイル サイズのセグメント化をサポートします。時間ごとに表示する
- ツール ライブラリには、lombok、hutool、commons-lang3、guava が統合されています。個別にインポートする必要はありません
- 統合された mybatisPlus のワンクリック コード生成
プロジェクトでの使用方法について話しましょう
新しい SpringBoot Web プロジェクトを作成します
pomにインポートするだけです
<dependency>
<groupId>cn.soboys</groupId>
<artifactId>rest-api-spring-boot-starter</artifactId>
<version>1.2.0</version>
</dependency>
起動クラスまたは構成クラスに @EnableRestFullApi
アノテーションを追加するだけです
RestFull API の使用法
このようにして、プロジェクト コントローラーで次のような通常のリクエストを記述します。
@PostMapping("/chat")
public HashMap chatDialogue() {
HashMap m = new HashMap();
m.put("age", 26);
m.put("name", "Judy");
return m;
}
返されるのは、グローバルに統合された RestFull API です
書くこともできます
多くの返品方法が提供されています。
もちろん、このインターフェイスをグローバルな戻り値にラップしたくない場合、たとえば、別の戻り値をカスタマイズしたい場合は、メソッドに@NoRestFulApi
アノテーションを追加するだけで済みます。
@PostMapping("/chat")
@NoRestFulApi
public HashMap chatDialogue() {
HashMap m = new HashMap();
m.put("age", 26);
m.put("name", "Judy");
return m;
}
返品内容のラッピングは行っておりません。
グローバルエラーインターセプト、パラメータ検証
すべての一般的な http エラー、すべてのリクエスト タイプとパラメータのエラーをカプセル化するのに役立ちます。
リクエストが間違っていた場合
{
"success": false,
"code": "405",
"msg": "方法不被允许",
"timestamp": "2023-07-03 22:36:47",
"data": "Request method 'GET' not supported"
}
要求されたリソースは存在しません
{
"success": false,
"code": "404",
"msg": "请求资源不存在",
"timestamp": "2023-07-03 22:42:35",
"data": "/api"
}
パラメータ検証エラー
Studen オブジェクトのパラメータを検証する
/**
* @author 公众号 程序员三时
* @version 1.0
* @date 2023/6/26 22:10
* @webSite https://github.com/coder-amiao
*/
@Data
public class Student {
@NotBlank
private String nam;
@NotBlank
private String hobby;
}
@PostMapping("/chat")
public HashMap chatDialogue(@Validated Student student) {
HashMap m = new HashMap();
m.put("age", 26);
m.put("name", "Judy");
return m;
}
リクエスト結果
JSONボディパラメータ
@PostMapping("/chat")
public HashMap chatDialogue(@RequestBody @Validated Student student) {
HashMap m = new HashMap();
m.put("age", 26);
m.put("name", "Judy");
return m;
}
間違った国際化
組み込みのカプセル化エラーは、デフォルトで英語と中国語の両方の国際化をサポートします。自動的にサポートするための設定は必要ありません。
より多くの言語に対する組み込みサポートが必要な場合は、それをオーバーライドするだけです。
独自のエラーの国際化と言語をカスタマイズする
i18n:
# 若前端无header传参则返回中文信息
i18n-header: Lang
default-lang: cn
message:
# admin
internal_server_error:
en: Internal Server Error
cn: 系统错误
not_found:
en: Not Found
cn: 请求资源不存在
メッセージはエラー プロンプトに対応し
、internal_server_error カスタマイズに対応します。
次の言語は自分で定義されており、フロントエンドは i18n ヘッダーで渡します。間違った言語を定義したことが表示されます。
エラーは発生しません。デフォルトの国際化は中国語です。default -lang: cn
で設定してください。
指定した言語を渡すと、構成した国際化カスタマイズに従ってエラー メッセージが返されます。
カスタムエラー応答
組み込みエラーがビジネス ニーズを満たせない場合は、独自のエラー コードをカスタマイズすることもできます
ResultCodeインターフェイスを実装するだけで、エラー列挙をカスタマイズできます。
package cn.soboys.restapispringbootstarter;
import cn.soboys.restapispringbootstarter.i18n.I18NKey;
/**
* @author 公众号 程序员三时
* @version 1.0
* @date 2023/6/26 10:21
* @webSite https://github.com/coder-amiao
* 响应码接口,自定义响应码,实现此接口
*/
public interface ResultCode extends I18NKey {
String getCode();
String getMessage();
}
国際化をサポートしたい場合は、国際化インターフェイスI18NKey を実装する必要があります。内部のHttpStatus実装を参照してください。
package cn.soboys.restapispringbootstarter;
import cn.soboys.restapispringbootstarter.i18n.I18NKey;
/**
* @author 公众号 程序员三时
* @version 1.0
* @date 2023/6/26 11:01
* @webSite https://github.com/coder-amiao
*/
public enum HttpStatus implements ResultCode, I18NKey {
/**
* 系统内部错误
*/
INTERNAL_SERVER_ERROR("500", "internal_server_error"),
BAD_GATEWAY("502", "bad_gateway"),
NOT_FOUND("404", "not_found"),
UNAUTHORIZED("401", "unauthorized"),
FORBIDDEN("403", "forbidden"),
METHOD_NOT_ALLOWED("405", "method_not_allowed"),
REQUEST_TIMEOUT("408", "request_timeout"),
INVALID_ARGUMENT("10000", "invalid_argument"),
ARGUMENT_ANALYZE("10001", "argument_analyze"),
BUSINESS_EXCEPTION("20000", "business_exception");
private final String value;
private final String message;
HttpStatus(String value, String message) {
this.value = value;
this.message = message;
}
@Override
public String getCode() {
return value;
}
@Override
public String getMessage() {
return message;
}
@Override
public String key() {
return message;
}
}
rest-api:
enabled: false
i18n:
# 若前端无header传参则返回中文信息
i18n-header: Lang
default-lang: cn
message:
# admin
internal_server_error:
en: Internal Server Error
cn: 系统错误
bad_gateway:
en: Bad Gateway
cn: 错误的请求
unauthorized:
en: Unauthorized
cn: 未授权
forbidden:
en: Forbidden
cn: 资源禁止访问
method_not_allowed:
en: Method Not Allowed
cn: 方法不被允许
request_timeout:
en: Request Timeout
cn: 请求超时
invalid_argument:
en: Invalid Argument {
}
cn: 参数错误 {
}
argument_analyze:
en: Argument Analyze {
}
cn: 参数解析异常 {
}
business_exception:
en: Business Exception
cn: 业务错误
not_found:
en: Not Found
cn: 请求资源不存在
内部エラーには構成は必要なく、国際化も自動的にサポートされます。さらに多くの言語をサポートする必要がある場合は、対象範囲をカスタマイズできます。
ビジネス例外アサーション
プロジェクト開発では、独自の例外クラスをカプセル化する必要がある場合がありますが、参考までに、統合エラー例外クラスをカプセル化しました。
BusinessException は、ビジネス例外クラスのグローバル エラー インターセプトを実装します。
統合されたビジネス例外アサーション ツールをカプセル化し、最初にエラーを返すという原則に従います。よりエレガントなコード
@GetMapping("/exception")
public Result exception(){
Student s=null;
Assert.isFalse(s==null,"学生不能为空");
return Result.buildSuccess();
}
均一なビジネス例外をスローする
もちろん、独自の例外クラスを定義したい場合。独自の例外クラスを定義し、BusinessExceptionを継承できます。
Redis ツール ライブラリで使用されるもの
さらに、Redis ツール ライブラリを使用するときに、Redis上で関連するすべてのキーと値の操作をカプセル化します。輸入する必要があります
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
デフォルトでは、インポートされません。
あとは使うときに注入するだけです
@Autowired
private RedisTempUtil redisTempUtil;
@GetMapping("/redis")
public Result redis() {
redisTempUtil.set("test", "123456");
return Result.buildSuccess();
}
@GetMapping("/redis/get")
public Result redisGet() {
String value = redisTempUtil.get("test").toString();
log.info("redis值{}", value);
return Result.buildSuccess();
}
RestTemplateリクエストツール
Post および GET プロジェクトで使用される場合、注入用に RestTemplate リクエストをさらにカプセル化します。
@Autowired
private RestFulTemp restFulTemp;
@GetMapping("/doGet")
public Result doGet() {
ResponseEntity<String> response = restFulTemp.doGet("http://127.0.0.1:8000/redis/get");
return Result.buildSuccess(response.getBody());
}
ログの使用状況
さらにログ処理をカプセル化して、すぐに使用できるようにします。プロパティファイルで関連するログ構成を構成します。
rest-api:
enabled: false
logging:
path: ./logs #日志存储路径(服务器上绝对)
max-history: 90 # 保存多少天
max-file-size: 3MB # 每个文件大小
max-total-size-cap: 1GB #总文件大小超过多少压缩
level-root: INFO # 这里的INFO可以替换为其他日志等级,如DEBUG, WARN, ERROR, TRACE, FATAL, OFF等。 日志等级由低到高分别是debugger-info-warn-error
プロパティ ファイルでログ設定が行われていない場合、デフォルトのログは上記のように設定されます。
統合された mybatisPlus のワンクリック コード生成
プロジェクトでは mybatisPlus を頻繁に使用しますが、ワンクリックで簡単なテンプレート コードを生成できます。デフォルトでは、mybatisPlus の関連パッケージには依存しません。自動コード生成を使用して mybatisPlus コード生成依存関係パッケージをインポートする必要がある場合。
<!--生成器依赖-->
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-generator</artifactId>
<version>3.4.1</version>
<optional>true</optional>
</dependency>
<!-- MySQL -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.28</version>
<optional>true</optional>
</dependency>
<!--代码生成依赖的模板引擎-->
<dependency>
<groupId>org.freemarker</groupId>
<artifactId>freemarker</artifactId>
<version>2.3.31</version>
<optional>true</optional>
</dependency>
テスト クラスを直接記述し、コード生成を直接呼び出すことができます。
public class Test {
public static void main(String[] args) {
GenerateCodeConfig config=new GenerateCodeConfig();
config.setDriverName("com.mysql.cj.jdbc.Driver");
config.setUsername("root");
config.setPassword("root");
config.setUrl("jdbc:mysql://127.0.0.1:3306/ry?useUnicode=true&useSSL=false&characterEncoding=utf8");
//生成代码保存路径,不设置就是当前项目下路径,如何设置请使用绝对路径
config.setProjectPath("superaide");
config.setPackages("cn.soboys.superaide");
MyBatisPlusGenerator.generate(config);
}
}
効果は以下の通りです
公式アカウントに注目してください。プログラマーは、あなたにインスピレーションと助けをもたらすことを願って、 3時に高品質のコンテンツを出力し続けます
次の記事では、このソース コードを分析し、独自のステーターをカプセル化する方法を説明します。