मैं वर्तमान में अपवादों को संभालने और मान्य करने के लिए Gson के संयोजन में JSON स्कीमा सत्यापनकर्ता का उपयोग कर रहा हूं एक एपीआई के लिए किए गए जेसन अनुरोध।

एक स्कीमा के साथ अनुरोध की तुलना करते समय सत्यापनकर्ता कई अपवाद वापस कर सकता है। भंडार से नमूना है:

try {
  schema.validate(rectangleMultipleFailures);
}
catch (ValidationException e) {
  System.out.println(e.getMessage());
  e.getCausingExceptions().stream()
      .map(ValidationException::getMessage)
      .forEach(System.out::println);
}

और try catch का मेरा कार्यान्वयन (स्पष्ट रूप से पकड़ गायब है) है:

try (InputStream inputStream = this.getClass().getResourceAsStream("SupplierSchemaIncoming.json")) {
    JSONObject rawSchema = new JSONObject(new JSONTokener(inputStream));
    Schema schema = SchemaLoader.load(rawSchema);
    // Throws a ValidationException if requestJson is invalid:
    schema.validate(new JSONObject(requestJson));
}
catch (ValidationException ve) {
    System.out.println(ve.toJSON().toString());
}

जैसा कि आप ऊपर देख सकते हैं, एक विकल्प सभी त्रुटियों को एक JSON के रूप में वापस करना है।

{
    "pointerToViolation": "#",
    "causingExceptions": [{
        "pointerToViolation": "#/name",
        "keyword": "type",
        "message": "expected type: String, found: Integer"
    }, {
        "pointerToViolation": "#/type",
        "keyword": "type",
        "message": "expected type: String, found: Integer"
    }],
    "message": "2 schema violations found"
}

हालांकि, मैं SchemaError ऑब्जेक्ट्स (नीचे) की एक सरणी वापस करने के लिए अपवाद प्राप्त करने के तरीके पर स्टम्प्ड हूं, जिसे मैं पार्स कर सकता हूं हालांकि मैं चाहता हूं।

package domainObjects;

import com.google.gson.annotations.Expose;

public class SchemaError {
    @Expose
    String pointerToViolation;

    @Expose
    String keyword;

    @Expose
    String message;

    public SchemaError() {}

    public String getPointerToViolation() {
        return pointerToViolation;
    }

    public void setPointerToViolation(String pointerToViolation) {
        this.pointerToViolation = pointerToViolation;
    }

    public String getKeyword() {
        return keyword;
    }

    public void setKeyword(String keyword) {
        this.keyword = keyword;
    }

    public String getMessage() {
        return message;
    }

    public void setMessage(String message) {
        this.message = message;
    }
}
0
TheMightyLlama 29 जून 2017, 17:52

1 उत्तर

सबसे बढ़िया उत्तर

एक अन्य उत्तर मिला, जिसने ऑब्जेक्ट को JSONObject से JSONElement में क्रमबद्ध करने की अनुशंसा की और उसे वापस कर रहे हैं। catch() के पास अब है:

    catch (ValidationException ve) {            

        JSONObject jsonObject = ve.toJSON();
        Gson gson = new Gson();
        JsonElement element = gson.fromJson(jsonObject.toString(), JsonElement.class);

        return element;

    }
0
TheMightyLlama 1 जुलाई 2017, 15:59