小编Ric*_*ick的帖子

通过XML转换CDATA从Java 8到Java 11来处理换行符的更改

使用Java 9 javax.xml.transform.TransformerOutputKeys.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)

java xml sax transformation java-11

11
推荐指数
1
解决办法
280
查看次数

流中收集器中的比较器导致类型推断问题?

我有以下简化的示例,以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)

所以:

  • 编译器能够推断出TreeMap的类型
  • 如果编译器知道TreeMap的类型,则它能够推断Comparator的类型。
  • 但是,如果编译器必须推断出TreeMap的类型,则它无法弄清Comparator的类型。

我不明白为什么编译器不能同时推断两种类型。我已经使用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)

java generics type-inference language-lawyer java-stream

4
推荐指数
1
解决办法
249
查看次数

在 gradle 插件中强制使用依赖版本

是否可以强制 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)

gradle gradle-plugin

2
推荐指数
1
解决办法
1502
查看次数