为了简化我的问题,假设我想用有效负载中的'd'替换所有'b'字符。
有没有一种方法可以让我原生地处理JSON数据,而不是首先将数据转换为XML?
我试图构建一个自定义的类中介来放入OutSequence中,但由于我只能访问MessageContext,它将有效负载视为XML,所以我遇到了问题。
"Destination": {
"name": "abc",
"type": "ST",
"$": "\n"
}
MessageContext.getEnvelope().getBody()
<Destination>
<name>abc</name>
<type>ST</type>
</Destination>
以在正常情况下传递内容(否则将在XML到JSON处理步骤中失败)。但必须有一种方法让我将数据操作为原生JSON(还是原生字符串?)也许能够获得输入流并从中操作数据?但我找不到从消息上下文到InputStream的方法?
WSO2本身已经编写了处理$字符的逻辑。
从他们的支持文档(https://docs.wso2.com/display/esb481/json+support):
在构建XML元素时,当“$”字符和数字作为JSON键的第一个字符出现时,ESB会以特殊的方式处理它们。
// "$a" replace with "_JsonReader_PS_a"
private String replaceInvalidCharacters(String keyString){
if(Pattern.compile("^[0-9]").matcher(keyString).find()) {
return "_JsonReader_PD_" + keyString;
} else if (keyString.startsWith("$")){
return "_JsonReader_PS_" + keyString.substring(1);
} else
return keyString;
}
import java.io.BufferedReader;
import java.io.ByteArrayInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import org.apache.axiom.om.OMElement;
import org.apache.axis2.AxisFault;
import org.apache.axis2.builder.Builder;
import org.apache.axis2.context.MessageContext;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.apache.synapse.commons.json.JsonStreamBuilder;
/*
* As WSO2 JSON parser can't handle single $ properties when converting between JSON and XML
* This custom JSON Stream builder replaces all $ signs with the constant '_JsonReader_PS_',
* which the WSO2 parser treats as a $ sign when transforming.
*/
public class CustomJsonStreamBuilder implements Builder {
private static final Log logger = LogFactory.getLog(CustomJsonStreamBuilder.class.getName());
JsonStreamBuilder jsonStreamBuilder = new JsonStreamBuilder();
public OMElement processDocument(InputStream arg0, String arg1, MessageContext arg2) throws AxisFault {
logger.debug("Processing input stream for custom JSON stream builder");
BufferedReader br = null;
StringBuilder sb = new StringBuilder();
String line;
try {
br = new BufferedReader(new InputStreamReader(arg0));
while ((line = br.readLine()) != null) {
sb.append(line);
}
String input = sb.toString();
/*
* WSO2 JSON parser treats _JsonReader_PS_ as $ in JSON structure
*/
input = input.replace("$", "_JsonReader_PS_");
InputStream is = new ByteArrayInputStream(input.getBytes("utf-8"));
if (br != null) {
try {
br.close();
} catch (IOException e) {
e.printStackTrace();
}
}
return jsonStreamBuilder.processDocument(is, arg1, arg2);
} catch (Exception e) {
e.printStackTrace();
logger.error("Problem processing input stream for custom JSON stream builder", e);
}
return jsonStreamBuilder.processDocument(arg0, arg1, arg2);
}
}
这是我的JavaFX控制器 所以我的问题是,在javaFX上下文中,处理<code>未来</code>结果的习惯用法是什么? 我知道我可以做,线程将阻塞,直到操作完成,但我会阻塞Application线程。我正在考虑在完成时进行回调,我发现了,哪种类型通过thenAccep执行此操作,但基于此答案,线程仍将被阻塞,这违反了Future的要点,就像答案中提到的那样。 在我的例子中,可调用的结果(在我
我用JavaFX做了一个国际象棋棋盘,并把所有的方格设置为GridPane的子方格,有没有办法用GridPane索引来访问这些方格并改变它们的属性? 我尝试通过磁贴矩阵访问一个磁贴来更改磁贴的颜色属性,但它不会更改 GridPane 中显示的磁贴。 的。getChildren()方法返回一个节点列表,一旦tile对象成为节点,我就无法访问它的方法。 这是我的磁贴类: } 这是我的董事会课:
问题内容: 我想使用Node Http模块直接调用服务器以设置我的量角器测试。Http基于回调,我想将其变为promise。 例如,我想让这个函数返回promise: 因此,问题是:我需要什么并代替“以某种方式创造承诺”才能使之起作用? 问题答案: 量角器使用WebDriver的承诺,并在“量角器”上全局公开该API。所以你应该能够做 有关完整的WebDriverJS Promise API,请参
根据手册中的组件页面,根据本论坛帖子,将在2019年6月为第14版的Vaadin Flowpromise提供一个合适的菜单栏小部件。 在此之前,该页面建议使用和在第12版中安装菜单栏。 梅努巴 计划在瓦丁14号。当前可通过组合选择(V12)和上下文菜单(V12)进行设置 (a) 我在版本12Javadoc中找不到或。 (b) 有人可以分享一个示例实现吗?
我正在使用junit运行一些单元测试。其中一个调用了一个对象中的方法,我使用mockito-like模拟该对象; 然后我设置mockito做一些类似的事情 现在myClass.foo实际上以我的另一个类(比如类Person)作为参数,我想做的是这样的事情 这当然是伪代码,但我希望它说明了我正在尝试做什么。这可能吗?
为什么下面的语句出现错误 当以下代码正常工作时