具有 JSON 响应的 WSO2DSS 嵌套查询

WSO2DSS nested query with JSON response

使用 WSO2DSS 3.5.1,我们有嵌套查询 return 宁分页信息和 sub-list 项目。

对于XML,它看起来很简单:

    <result element="results" rowName="result" >
        <element column="pagecount"   name="pageCount"   xsdType="integer"/>
        <element column="resultcount" name="resultCount" xsdType="integer"/>
        <element column="currpage"    name="page"        xsdType="integer"/>
        <call-query href="positions_list">
            <with-param name="page" query-param="page"/>
        </call-query>
    </result>

我们如何使用带有 JSON 响应的嵌套查询 (query-call)? 当请求 "Accept: application/json" header 时,我们收到 Whosebug 错误

java.lang.WhosebugError
    at javax.xml.namespace.QName.equals(Unknown Source)
    at java.util.HashMap.getNode(HashMap.java:571)
    at java.util.HashMap.get(HashMap.java:556)
    at org.apache.ws.commons.schema.XmlSchemaObjectTable.getItem(XmlSchemaObjectTable.java:50)
    at org.apache.ws.commons.schema.XmlSchema.getTypeByName(XmlSchema.java:296)
    at org.apache.ws.commons.schema.XmlSchema.getTypeByName(XmlSchema.java:346)
    at org.apache.axis2.json.gson.factory.XmlNodeGenerator.getSchemaTypeOfElement(XmlNodeGenerator.java:146)
    at org.apache.axis2.json.gson.factory.XmlNodeGenerator.processElement(XmlNodeGenerator.java:136)
    at org.apache.axis2.json.gson.factory.XmlNodeGenerator.processSchemaType(XmlNodeGenerator.java:166)
    at org.apache.axis2.json.gson.factory.XmlNodeGenerator.processElement(XmlNodeGenerator.java:112)
    at org.apache.axis2.json.gson.factory.XmlNodeGenerator.processSchemaType(XmlNodeGenerator.java:166)
    at org.apache.axis2.json.gson.factory.XmlNodeGenerator.processElement(XmlNodeGenerator.java:137)

到目前为止,我们发现它是在使用嵌套查询请求 JSON 响应时发生的。

To return JSON 响应看起来很简单(并且很容易转换为 XML)

    <result outputType="json">
      {"UserPositionListPage": {
        { "pageCount": $pagecount,
          "resultCount": $resultcount,
          "page": $currpage       
        }   }          
    </result>

但是我们看不到包含来自嵌套调用的响应的方法。有什么建议/想法吗?

编辑:似乎我必须处理可重复的案例,因为我们已经有一个带有嵌套调用的服务 returning XML 并且它在请求 json 时一直有效:/ 我不会不介意服务是否总是 return JSON 或 XML 而不管请求的内容类型(假设我们可以使用 ESB 或 APIM 进行转换)

更新 axis2.xml 以使用 org.apache.axis2.json 包中的消息格式化程序和生成器(而不是 "gson")至少解决了 WhosebugError

    <messageFormatter contentType="application/json"
                      class="org.apache.axis2.json.JSONMessageFormatter"/>

    <messageBuilder contentType="application/json"
                    class="org.apache.axis2.json.JSONOMBuilder"/>

所以基本上使用不同的(较旧的?)json 格式化程序和构建器允许我们使用嵌套查询返回 XML 并让 DSS 转换响应

编辑:

DOC 中描述了嵌套的 JSON 查询:https://docs.wso2.com/display/DSS351/Exposing+Data+in+JSON+Format#ExposingDatainJSONFormat-NestedQueries

{
  "result": {
  "total": $total,
  "limit": $page_limit,
  "offset": $page_offset,
  "@positions_list": "$limit->limit,$offset->offset"
       }
}

将 positions_list 查询作为嵌套查询调用