我们正在使用Apache CXF作为Java第一个基于SOAP的Web服务实现,而不是合同第一种方法。我们还没有指定任何数据绑定,这可能意味着将使用默认的JAXB数据绑定。
从最近的内存分析中,我们发现创建了数百万个重复的String对象。我想通过尝试调用String的intern()方法来避免这种情况。如果我没有使用CXF,我知道我们可以通过从https://jaxb.java.net/nonav/2.2.4/docs/api/javax/xml/bind/DatatypeConverter.html#parseString%28java.lang.String%29返回String.intern()并在类路径中指定外部jaxb绑定文件来完成此操作。像这样的东西 -
public static String forceStringInterning(String str) {
if (StringUtils.isBlank(str)) {
return null;
}
return DatatypeConverter.parseString(str).intern();
}
然而,这并不适用于CXF。
从CXF网站上阅读,我明白CXF内部使用JAXBDataBinding.java,它暴露了某些属性和一些其他地图(marshaller,unmarshaller,contextProperties等)但是,我无法找到一种方法继续实现我的目标。
另一种选择是使用强制实习的String的XMLJavaTypeAdapter,但即使这意味着我必须为每个我想要这种行为的包和子包创建一个package-info.java。
我已经看过其他人们似乎尝试过其他自定义方法的例子。 Reuse CXF jaxb context between multiple services但是,还没有设法解决它。
非常感谢任何帮助!