Spring boot 與 json_schema ,請求和響應 校驗

del88發表於2024-07-20

java 中 如何 使用 json_schema 對json進行校驗

在Java中使用JSON Schema對JSON進行校驗,你首先需要選擇一個合適的庫。一個常用的庫是json-schema-validator。以下是如何使用它的基本步驟:

  1. 新增依賴

    如果你使用Maven,可以在pom.xml中新增以下依賴:

    <dependency>
        <groupId>com.github.fge</groupId>
        <artifactId>json-schema-validator</artifactId>
        <version>2.2.6</version>
    </dependency>
    

    如果使用Gradle,可以在build.gradle中新增:

    implementation 'com.github.fge:json-schema-validator:2.2.6'
    
  2. 編寫JSON Schema

    假設你有以下的JSON資料:

    {
        "name": "John Doe",
        "age": 30
    }
    

    對應的JSON Schema可能是這樣的:

    {
        "$schema": "http://json-schema.org/draft-04/schema#",
        "title": "Person",
        "type": "object",
        "properties": {
            "name": {
                "type": "string"
            },
            "age": {
                "type": "integer"
            }
        },
        "required": ["name", "age"]
    }
    
  3. 編寫Java程式碼進行校驗

    import com.github.fge.jsonschema.core.exceptions.ProcessingException;
    import com.github.fge.jsonschema.core.report.ProcessingReport;
    import com.github.fge.jsonschema.main.JsonSchema;
    import com.github.fge.jsonschema.main.JsonSchemaFactory;
    
    public class JsonSchemaExample {
        public static void main(String[] args) {
            // JSON Schema
            String schemaJson = "{\"$schema\":\"http://json-schema.org/draft-04/schema#\",\"title\":\"Person\",\"type\":\"object\",\"properties\":{\"name\":{\"type\":\"string\"}},\"age\":{\"type\":\"integer\"}},\"required\":[\"name\",\"age\"]}";
    
            // JSON data
            String jsonData = "{\"name\":\"John Doe\",\"age\":30}";
    
            // Create the JsonSchema object
            JsonSchemaFactory factory = JsonSchemaFactory.byDefault();
            JsonSchema schema = factory.getJsonSchema(schemaJson);
    
            // Validate
            ProcessingReport report = schema.validate(jsonData);
    
            if (!report.isSuccess()) {
                System.out.println("Validation failed:");
                report.forEach(error -> System.out.println(error.getMessage()));
            } else {
                System.out.println("Validation succeeded!");
            }
        }
    }
    

    這段程式碼首先建立了一個JsonSchema物件,然後使用它來校驗JSON資料。如果校驗失敗,它將列印出錯誤資訊。

這就是在Java中使用JSON Schema進行JSON校驗的基本步驟。你可以根據實際需要調整JSON Schema和JSON資料。

spring boot 為什麼 不採用 json_schema來校驗 json而是使用 @NotBlank這樣的註解

Spring Boot 選擇使用如 @NotBlank 這樣的註解來進行資料校驗,而不是採用 JSON Schema,主要基於以下幾個原因:

  1. 整合方便:Spring Boot 提供了強大的資料繫結和校驗功能,這些功能是透過 Hibernate Validator 或其他 JSR-303/JSR-380 實現來提供的。使用 @NotBlank 等註解可以非常方便地整合到 Spring Boot 應用程式中,而不需要額外的庫或配置。

  2. 易用性:使用註解進行資料校驗非常直觀和易用。開發者只需要在相應的欄位上新增註解,就可以自動進行校驗,無需編寫額外的校驗程式碼。

  3. 靈活性:註解校驗提供了豐富的校驗選項,如 @NotNull@Size@Pattern 等,可以滿足大多數校驗需求。此外,開發者還可以自定義校驗註解,以滿足特定的校驗邏輯。

  4. 效能:註解校驗通常在應用程式的上下文中進行,這意味著校驗邏輯是在應用程式內部執行的,而不是透過外部庫或服務。這通常可以提供更好的效能,因為減少了網路通訊和額外的處理開銷。

  5. 與Spring生態的緊密整合:Spring Boot 是 Spring 生態的一部分,它充分利用了 Spring 框架提供的功能。使用註解進行資料校驗與 Spring 的其他功能(如資料繫結、表單處理等)緊密整合,提供了無縫的開發體驗。

儘管 JSON Schema 提供了一種標準的方式來定義和校驗 JSON 資料,但它在 Spring Boot 應用程式中的整合和使用可能不如註解校驗那樣方便和直觀。然而,對於需要在應用程式之間共享 JSON Schema 或與其他系統互動的場景,使用 JSON Schema 進行資料校驗仍然是一個很好的選擇。

spring boot 專案的 Request 可以 透過 @NotBlank 註解來實現 終端請求必選欄位,那響應呢,如何實現 服務端響應時 必須響應一些欄位

在Spring Boot專案中,對於請求的驗證,我們常使用如@NotBlank等註解來確保接收到的資料滿足特定條件。而對於響應(即服務端返回給客戶端的資料),通常沒有內建的註解或機制來強制要求某些欄位必須存在或滿足特定條件。不過,可以透過以下幾種方式來實現或確保響應中包含必需的欄位:

  1. DTO(Data Transfer Object)類與校驗

    建立一個DTO類,用於封裝要返回給客戶端的資料。在這個DTO類中,可以使用諸如@NotNull@NotEmpty等校驗註解來標註那些必須存在的欄位。雖然這些註解在執行時不會自動觸發校驗(因為沒有內建的機制來在序列化時應用這些校驗),但它們可以作為文件和編碼時的指導,幫助開發者確保返回的資料包含所有必要的欄位。

  2. 單元測試

    編寫單元測試來驗證API的響應。這些測試可以檢查響應中是否包含所有必需的欄位,以及這些欄位的值是否符合預期。

  3. 序列化時的自定義校驗

    在序列化DTO到JSON或其他格式之前,可以編寫自定義的校驗邏輯來確保所有必需的欄位都已設定。這可以透過在序列化方法中新增校驗程式碼來實現。

  4. 使用MapStruct等庫

    如果你使用MapStruct這樣的物件對映庫來將實體轉換為DTO,可以在對映過程中新增自定義邏輯來確保所有必需的欄位都被正確對映和設定。

  5. OpenAPI/Swagger文件

    使用OpenAPI或Swagger來為你的API生成文件,並在文件中明確指出哪些欄位是必需的。這不會強制實現這些要求,但它會幫助API的使用者理解他們應該期望在響應中看到哪些資料。

總的來說,雖然Spring Boot沒有提供內建的機制來強制要求響應中包含某些欄位,但透過上述方法,你可以確保你的API以一致和預期的方式返回資料。

相關文章