使用Java 9 javax.xml.transform.Transformer,OutputKeys.INDENT处理CDATA标签的方式发生了变化。简而言之,在Java 8中,名为“ test”的标签包含一些字符数据将导致:
<test><![CDATA[data]]></test>
但是对于Java 9,结果相同
<test>
<![CDATA[data]]>
</test>
XML不一样。有关更多信息,请参见http://java9.wtf/xml-transformer/。
我了解到,对于Java 9,有一种解决方法可以使用DocumentBuilderFactorywith,setIgnoringElementContentWhitespace=true但这不再适用于Java 11。
有谁知道在Java 11中处理此问题的方法吗?我正在寻找一种方法来防止多余的换行符(但仍然能够格式化我的XML),或者能够在解析XML时忽略它们(最好使用SAX)。
不幸的是,我不知道CDATA标签将实际包含在我的应用程序中。它可能以空格或换行符开头或结尾,因此在读取XML或实际在结果对象中设置值时,我不能只是剥离它们。
示例程序来演示该问题:
public static void main(String[] args) throws TransformerException, ParserConfigurationException, IOException, SAXException
{
String data = "data";
StreamSource source = new StreamSource(new StringReader("<foo><bar><![CDATA[" + data + "]]></bar></foo>"));
StreamResult result = new StreamResult(new StringWriter());
Transformer tform = TransformerFactory.newInstance().newTransformer();
tform.setOutputProperty(OutputKeys.INDENT, "yes");
tform.transform(source, result);
String xml = result.getWriter().toString();
System.out.println(xml); // I expect bar and CDATA to be …Run Code Online (Sandbox Code Playgroud) 我有以下简化的示例,以TreeMap从Integer到List的形式将字符串列表分组为类别
public static void main(String[] args)
{
List<String> list = Arrays.asList("A", "B", "C", "D", "E");
TreeMap<Integer, List<String>> res = list.stream()
.collect(Collectors.groupingBy(
s -> s.charAt(0) % 3,
() -> new TreeMap<>(Comparator.<Integer>reverseOrder()), // Type required
Collectors.toList()
));
System.out.println(res);
}
Run Code Online (Sandbox Code Playgroud)
如果我未指定Comparator.reverseOrder()的类型,则代码将无法编译(有关错误,请参见文章底部)。
如果我明确指定TreeMap的类型而不是Comparator.reverseOrder()的类型,则代码可以正常工作。
() -> new TreeMap<Integer, List<String>>(Comparator.reverseOrder()), // Type required
Run Code Online (Sandbox Code Playgroud)
所以:
我不明白为什么编译器不能同时推断两种类型。我已经使用Oracle的JDK 1.8.0_191和AdoptOpenJDK的JDK 11.0.1_13进行了测试,结果相同。
这是我不知道的一些限制吗?
Error:(22, 32) java: no suitable method found for groupingBy((s)->s.cha[...]) % 3,()->new Tr[...]er()),java.util.stream.Collector<java.lang.Object,capture#1 of ?,java.util.List<java.lang.Object>>)
method java.util.stream.Collectors.<T,K>groupingBy(java.util.function.Function<? super T,? extends K>) is not applicable
(cannot infer …Run Code Online (Sandbox Code Playgroud) 是否可以强制 gradle 在插件中使用不同的依赖项?
我想运行 openapi-generator 5.1.1 插件,但我希望它使用 swagger-parser 2.0.26。其原因就是下面提到的问题。在该问题中,用户“selliera”提到他能够运行具有该依赖项的插件(好吧,他提到了 2.0.20,但未发布的修复程序使用 2.0.26)。
https://github.com/OpenAPITools/openapi-generator/issues/8266
我尝试过使用严格版本:
dependencies {
implementation("io.swagger.parser.v3:swagger-parser") {
version {
strictly "2.0.26"
}
}
}
Run Code Online (Sandbox Code Playgroud)
并使用
configurations.all {
resolutionStrategy {
eachDependency { DependencyResolveDetails details ->
if (details.requested.group == 'io.swagger.parser.v3' && details.requested.name =='swagger-parser') {
details.useVersion("2.0.26")
}
}
}
}
Run Code Online (Sandbox Code Playgroud)
但似乎都没有任何效果。
这是一个简单的 gradle 脚本来演示该问题。如果将petstore 规范的内容放入下面脚本中指定的 petstore.yml 文件中并运行openApiGenerate,则它可以正常工作。如果您将 petstore 规范中的 url 更改为相对的 URL(如链接问题中所示),则生成器将失败。使用新版本的 swagger-parser 应该可以解决这个问题。
plugins {
id 'java'
id 'org.openapi.generator' version '5.1.1'
}
repositories {
mavenCentral()
}
openApiGenerate { …Run Code Online (Sandbox Code Playgroud)