具有 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 查询作为嵌套查询调用
使用 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 查询作为嵌套查询调用