#json #wso2 #apim
Вопрос:
Я использую wso2 apim 3.1.0, я хочу включить проверку схемы json для полезной нагрузки json. Я сослался на документ belpw для настройки проверки json shema в wso2 apim https://m-saranki.medium.com/unboxing-json-schema-validator-320-2dd944dae6c0 . Я тестирую приведенный ниже API для проверки схемы json
openapi: "3.0.1"
info:
title: "SampleAPI"
version: "1.2.3"
servers:
-
url: "/"
security:
-
default: []
paths:
/*:
get:
responses:
200:
description: "OK"
security:
-
default: []
x-auth-type: "Application amp; Application User"
x-throttling-tier: "Unlimited"
x-wso2-application-security:
security-types:
- "oauth2"
- "basic_auth"
optional: false
put:
responses:
200:
description: "OK"
security:
-
default: []
x-auth-type: "Application amp; Application User"
x-throttling-tier: "Unlimited"
x-wso2-application-security:
security-types:
- "oauth2"
- "basic_auth"
optional: false
post:
requestBody:
content:
application/json:
schema:
$ref: "#/components/schemas/User"
required: false
responses:
200:
description: "OK"
security:
-
default: []
x-auth-type: "Application amp; Application User"
x-throttling-tier: "Unlimited"
x-wso2-application-security:
security-types:
- "oauth2"
- "basic_auth"
optional: false
delete:
responses:
200:
description: "OK"
security:
-
default: []
x-auth-type: "Application amp; Application User"
x-throttling-tier: "Unlimited"
x-wso2-application-security:
security-types:
- "oauth2"
- "basic_auth"
optional: false
patch:
responses:
200:
description: "OK"
security:
-
default: []
x-auth-type: "Application amp; Application User"
x-throttling-tier: "Unlimited"
x-wso2-application-security:
security-types:
- "oauth2"
- "basic_auth"
optional: false
components:
schemas:
User:
required:
- "id"
properties:
id:
type: "string"
format: "uuid"
name:
type: "string"
email:
type: "string"
format: "email"
dob:
type: "string"
format: "date"
securitySchemes:
default:
type: "oauth2"
flows:
implicit:
authorizationUrl: "https://test.com"
scopes: {}
x-wso2-auth-header: "Authorization"
x-wso2-cors:
corsConfigurationEnabled: false
accessControlAllowOrigins:
- "*"
accessControlAllowCredentials: false
accessControlAllowHeaders:
- "authorization"
- "Access-Control-Allow-Origin"
- "Content-Type"
- "SOAPAction"
- "apikey"
- "Credentials"
accessControlAllowMethods:
- "GET"
- "PUT"
- "POST"
- "DELETE"
- "PATCH"
- "OPTIONS"
x-wso2-production-endpoints:
urls:
- "http://localhost:9090/Cipango-CallAS/v1/sp/1/accounts/123/call"
type: "http"
x-wso2-sandbox-endpoints:
urls:
- "http://localhost:9090/Cipango-CallAS/v1/sp/1/accounts/123/call"
type: "http"
x-wso2-basePath: "/sample/1.2.3"
x-wso2-transports:
- "http"
- "https"
x-wso2-response-cache:
enabled: false
cacheTimeoutInSeconds: 300`
Но когда я запускаю запрос с правильной полезной нагрузкой json, я вижу следующее сообщение об ошибке
TID: [-1] [] [2021-10-19 16:14:48,136] WARN {org.apache.synapse.transport.passthru.SourceHandler} - I/O error: Received fatal alert: certificate_unknown
TID: [-1234] [] [2021-10-19 16:14:49,237] ERROR {org.apache.synapse.transport.passthru.ServerWorker} - Error processing POST request for : /sample/1.2.3. java.lang.IllegalArgumentException: JsonObject (through reference chain: com.google.gson.JsonArray["asBoolean"])
at com.fasterxml.jackson.databind.ObjectMapper._convert(ObjectMapper.java:3751)
at com.fasterxml.jackson.databind.ObjectMapper.convertValue(ObjectMapper.java:3669)
at org.wso2.carbon.apimgt.gateway.handlers.security.SchemaValidator.extractReference_aroundBody26(SchemaValidator.java:547)
at org.wso2.carbon.apimgt.gateway.handlers.security.SchemaValidator.extractReference(SchemaValidator.java:532)
at org.wso2.carbon.apimgt.gateway.handlers.security.SchemaValidator.extractSchemaFromRequest_aroundBody18(SchemaValidator.java:327)
at org.wso2.carbon.apimgt.gateway.handlers.security.SchemaValidator.extractSchemaFromRequest(SchemaValidator.java:297)
at org.wso2.carbon.apimgt.gateway.handlers.security.SchemaValidator.getSchemaContent_aroundBody16(SchemaValidator.java:284)
at org.wso2.carbon.apimgt.gateway.handlers.security.SchemaValidator.getSchemaContent(SchemaValidator.java:281)
at org.wso2.carbon.apimgt.gateway.handlers.security.SchemaValidator.validateRequest_aroundBody8(SchemaValidator.java:211)
at org.wso2.carbon.apimgt.gateway.handlers.security.SchemaValidator.validateRequest(SchemaValidator.java:209)
at org.wso2.carbon.apimgt.gateway.handlers.security.SchemaValidator.handleRequest_aroundBody2(SchemaValidator.java:114)
at org.wso2.carbon.apimgt.gateway.handlers.security.SchemaValidator.handleRequest(SchemaValidator.java:75)
at org.apache.synapse.rest.API.process(API.java:367)
at org.apache.synapse.rest.RESTRequestHandler.apiProcessNonDefaultStrategy(RESTRequestHandler.java:149)
at org.apache.synapse.rest.RESTRequestHandler.dispatchToAPI(RESTRequestHandler.java:95)
at org.apache.synapse.rest.RESTRequestHandler.process(RESTRequestHandler.java:71)
at org.apache.synapse.core.axis2.Axis2SynapseEnvironment.injectMessage(Axis2SynapseEnvironment.java:327)
at org.apache.synapse.core.axis2.SynapseMessageReceiver.receive(SynapseMessageReceiver.java:98)
at org.apache.axis2.engine.AxisEngine.receive(AxisEngine.java:180)
at org.apache.synapse.transport.passthru.ServerWorker.processNonEntityEnclosingRESTHandler(ServerWorker.java:368)
at org.apache.synapse.transport.passthru.ServerWorker.processEntityEnclosingRequest(ServerWorker.java:427)
at org.apache.synapse.transport.passthru.ServerWorker.run(ServerWorker.java:182)
at org.apache.axis2.transport.base.threads.NativeWorkerPool$1.run(NativeWorkerPool.java:172)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
at java.lang.Thread.run(Thread.java:748)
Caused by: com.fasterxml.jackson.databind.JsonMappingException: JsonObject (through reference chain: com.google.gson.JsonArray["asBoolean"])
at com.fasterxml.jackson.databind.JsonMappingException.wrapWithPath(JsonMappingException.java:394)
at com.fasterxml.jackson.databind.JsonMappingException.wrapWithPath(JsonMappingException.java:353)
at com.fasterxml.jackson.databind.ser.std.StdSerializer.wrapAndThrow(StdSerializer.java:316)
at com.fasterxml.jackson.databind.ser.std.BeanSerializerBase.serializeFields(BeanSerializerBase.java:727)
at com.fasterxml.jackson.databind.ser.BeanSerializer.serialize(BeanSerializer.java:155)
at com.fasterxml.jackson.databind.ser.DefaultSerializerProvider._serialize(DefaultSerializerProvider.java:480)
at com.fasterxml.jackson.databind.ser.DefaultSerializerProvider.serializeValue(DefaultSerializerProvider.java:319)
at com.fasterxml.jackson.databind.ObjectMapper._convert(ObjectMapper.java:3729)
... 25 more
Caused by: java.lang.UnsupportedOperationException: JsonObject
at com.google.gson.JsonElement.getAsBoolean(JsonElement.java:153)
at com.google.gson.JsonArray.getAsBoolean(JsonArray.java:370)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:498)
at com.fasterxml.jackson.databind.ser.BeanPropertyWriter.serializeAsField(BeanPropertyWriter.java:688)
at com.fasterxml.jackson.databind.ser.std.BeanSerializerBase.serializeFields(BeanSerializerBase.java:719)
... 29 more
Дайте мне знать, в чем здесь может быть проблема.
Ответ №1:
- Объяснение
Я полагаю, что вы используете ванильный пакет wso2am-3.1.0 вместе с файлом пользовательской последовательности, в котором, вероятно, есть посредник, использующий выражение «json-eval ($.)». Пожалуйста, подтвердите. Это известная проблема в ванильных пакетах wso2am-3.0.0 и wso2am-3.1.0.
Это потому что, когда мы использовать JSON-функции eval($.) выражение в последовательности в <APIM_HOME>/репозиторий/развертывание/сервер/синапс-конфиги по умолчанию//последовательности каталог, и когда он развертывается, синапс установка GsonJsonProvider [1] для представления JSON внутрь Jayway помощью jsonpath[2].
Поскольку GsonJsonProvider загружается, даже если мы удалим конкретный файл последовательности, содержащий выражение json-eval($.) в посреднике свойств, проблема будет сохраняться до тех пор, пока мы не перезагрузим сервер.
Но, если мы не используем данные в JSON-функции eval($.) выражение в последовательности в <APIM_HOME>/репозиторий/развертывание/сервер/синапс-конфиги по умолчанию//последовательности каталог, мы не получим сообщение об ошибке выше, когда мы включить проверку схемы JSON в качестве jsonsmartjsonprovider [3] используется для представления JSON внутрь Jayway помощью jsonpath.
Поскольку представление объекта JSON в сценарии ошибки меняется, в этом случае возникает исключение IllegalArgumentException.
- Решение
Вы можете подойти к одному из следующих решений, как предложено ниже.
- Эта проблема была исправлена в последнем пакете WUM/updated. Если у вас есть подписка на WSO2, вы можете получить последнее обновление.
- Вы можете развернуть новый пакет ванили wso2am-3.1.0 и вызывать вызовы API без последовательности, имеющей выражение json-eval ($.).
Комментарии:
1. Спасибо за ответ — у меня нет никакого раздела посредничества, подключенного к вышеуказанному API . Но есть некоторые другие API, которые имеют последовательность посредничества, включающую json-eval($.). Это также вызывает ту же проблему, что и выше ?
2. ДА. Как я уже объяснял ранее, когда последовательности будут развернуты, GsonJsonProvider будет загружен, несмотря на API, к которому принадлежит последовательность. Это является причиной получения этой ошибки.
3. каковы могут быть альтернативы json-eval($.) для анализа ответа json?
4. Для доступа к содержимому полезной нагрузки json вы можете использовать выражения JSONPath (с помощью метода json-eval ()) или выражения XPath. Поскольку у вас возникли проблемы с json-eval(), вы можете использовать выражения XPath. Пожалуйста, обратитесь к разделу «Доступ к контенту из полезных нагрузок JSON» в docs.wso2.com/display/EI600/JSON Поддержка