是否真的没有办法直接使用javax.xml.stream.XMLStreamWriter(Java SE 6)编写格式化的XML?这真是令人难以置信,因为其他XML API(如JAXB和一些DOM库)能够做到这一点.即使.NET XMLStreamWriter等效也能够使用此AFAIK(如果我没记错的话,该类是System.Xml.XmlTextWriter).
这意味着我唯一的选择是重新分析XML以生成格式化输出?
例如:
StringWriter sw = new StringWriter();
XMLOutputFactory xmlOutputFactory = XMLOutputFactory.newFactory();
XMLStreamWriter xmlStreamWriter = xmlOutputFactory.createXMLStreamWriter(sw);
writeXml(xmlStreamWriter);
xmlStreamWriter.flush();
xmlStreamWriter.close();
TransformerFactory factory = TransformerFactory.newInstance();
Transformer transformer = factory.newTransformer();
transformer.setOutputProperty(OutputKeys.INDENT, "yes");
transformer.setOutputProperty("{http://xml.apache.org/xslt}indent-amount", "4");
StringWriter formattedStringWriter = new StringWriter();
transformer.transform(new StreamSource(new StringReader(sw.toString())), new StreamResult(formattedStringWriter));
System.out.println(formattedStringWriter);
Run Code Online (Sandbox Code Playgroud)
此解决方案的问题是属性"{http://xml.apache.org/xslt}indent-amount".我没有找到任何关于它的文档,它似乎不保证是可移植的.
那么,如果我想用标准的Java 6类做什么,我还有什么其他选择?创建一个JAXB或DOM对象图只是为了漂亮的打印?
这是我到目前为止所得到的:
Optional<Foo> firstChoice = firstChoice();
Optional<Foo> secondChoice = secondChoice();
return Optional.ofNullable(firstChoice.orElse(secondChoice.orElse(null)));
Run Code Online (Sandbox Code Playgroud)
这让我觉得既丑陋又浪费.如果firstChoice存在,我不必要地计算secondChoice.
还有一个更高效的版本:
Optional<Foo> firstChoice = firstChoice();
if(firstChoice.isPresent()) {
return firstChoice;
} else {
return secondChoice();
}
Run Code Online (Sandbox Code Playgroud)
在这里,我无法将一些映射函数链接到最终,而无需复制映射器或声明另一个局部变量.所有这些使得代码比实际解决的问题更复杂.
我宁愿写这个:
return firstChoice().alternatively(secondChoice());
Run Code Online (Sandbox Code Playgroud)
但是Optional ::或者显然不存在.怎么办?
在我的单元测试中,我想在$ {project.build.directory}中创建一个tmp目录.如何在单元测试中访问$ {project.build.directory}的值?
我能想到的一种方法是在测试资源中提供过滤的属性文件,该文件保留该值.(我还没有尝试,但我认为这应该有效.)
是否有直接访问/传递此属性值的方法?
此致,弗洛里安
一些重载的调用请求方法,例如:get()和post(Entity<?> entity)(还有其他)SyncInvoker返回一个Response对象,而不是解组的内容.
我注意到,在get()没有文档的情况下ResponseProcessingException,而其他方法,如所有3个重载 post方法,可能会抛出一个ResponseProcessingException.
我知道这ResponseProcessingException是RuntimeException继承自的ProcessingException,但我仍然会解释这意味着该get()方法不会抛出ResponseProcessingException.
它是否正确?怎么样ClientResponseFilter?为什么比其他的呼叫请求方法(行为不同的行为put,post......)?
另外,Javadoc用于抛出的方法ResponseProcessingException说:
在接收到的HTTP响应的处理失败的情况下(例如,在过滤器中或在将响应实体数据转换为特定Java类型的实例期间).
那个部分:
或者在将响应实体数据转换为特定Java类型的实例期间
在这里似乎是错误的,因为该readEntity方法不应该被调用:
https://jersey.java.net/documentation/latest/filters-and-interceptors.html#d0e9915
这是复制和粘贴文档错误吗?
不过,我猜过滤器是一个有效的案例.
我有这样的绑定文件
<jxb:bindings version="2.0" xmlns:jxb="http://java.sun.com/xml/ns/jaxb"
xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<jxb:bindings schemaLocation="example.xsd" node="/xs:schema">
<jxb:schemaBindings>
<jxb:package name="example" />
</jxb:schemaBindings>
<jxb:globalBindings>
<jxb:javaType name="java.util.Calendar" xmlType="xs:dateTime"
parseMethod="javax.xml.bind.DatatypeConverter.parseDateTime"
printMethod="javax.xml.bind.DatatypeConverter.printDateTime" />
<jxb:javaType name="java.util.Calendar" xmlType="xs:date"
parseMethod="javax.xml.bind.DatatypeConverter.parseDate"
printMethod="javax.xml.bind.DatatypeConverter.printDate" />
<jxb:javaType name="java.util.Calendar" xmlType="xs:time"
parseMethod="javax.xml.bind.DatatypeConverter.parseTime"
printMethod="javax.xml.bind.DatatypeConverter.printTime" />
</jxb:globalBindings>
</jxb:bindings>
</jxb:bindings>
Run Code Online (Sandbox Code Playgroud)
模式类在"example"(正确)中生成,但是"org.w3._2001.xmlschema"中的XmlAdapters(错误).我怎样才能解决这个问题?
我正在尝试使用Maven发布一个库并执行一个站点部署到sourceforge(我先创建了一个交互式shell).该版本由Jenkins工作完成(使用Jenkins的Maven Release Plugin).
我试过了:
-X -e -Dresume=false -Dusername=puce release:prepare release:perform -Darguments="-Dusername=puce"
Run Code Online (Sandbox Code Playgroud)
和
-X -e -Dresume=false -Dusername=puce -Darguments=-Dusername=puce release:prepare release:perform
Run Code Online (Sandbox Code Playgroud)
但两次工作都挂在现场:部署第一个模块:
[INFO] --- maven-site-plugin:3.2:deploy (default-deploy) @ myproject-parent ---
[INFO] Parent project loaded from repository: myGroupId:myOtherproject-parent:pom:1.0
[INFO] Parent project loaded from repository: myGroupId:myOtherproject-parent:pom:1.0
Using private key: /opt/jenkins/.ssh/id_dsa
Run Code Online (Sandbox Code Playgroud)
当我停止工作时,最后会打印以下内容:
Password for ${username}@shell.sourceforge.net: channel stopped
Run Code Online (Sandbox Code Playgroud)
这可能意味着$ {username}未得到解决.
如何解析$ {username}?
编辑:
请注意,以下运行正常:
site-deploy -Psonatype-oss-release -Dusername=puce
Run Code Online (Sandbox Code Playgroud)
编辑2: 作为发布的一部分:执行maven执行以下命令:
/usr/share/maven/bin/mvn -s /tmp/release-settings7797889802430474959.xml deploy site-deploy --no-plugin-updates --batch-mode -Psonatype-oss-release -P nexus -f pom.xml
Run Code Online (Sandbox Code Playgroud)
-Dusername=puce 似乎没有传递给这个maven命令......
另请注意help:effective-pom显示以下maven-release-plugin配置:
<plugin>
<artifactId>maven-release-plugin</artifactId>
<version>2.2.2</version> …Run Code Online (Sandbox Code Playgroud) 我正在使用httpunit来访问服务器.
我需要为此配置代理设置(http和https).
我在settings.xml文件中设置了配置,但是确定似乎忽略了它!?
我想避免尽可能复制配置.
在surefire插件配置中我试过:
<systemPropertyVariables>
<http.proxyHost>${http.proxyHost}</http.proxyHost>
</systemPropertyVariables>
Run Code Online (Sandbox Code Playgroud)
和
<argLine>-Dhttp.proxyHost=${http.proxyHost}</argLine>
Run Code Online (Sandbox Code Playgroud)
和
<argLine>-Dhttp.proxyHost=${settings.proxies[protocol=http].host}</argLine>
Run Code Online (Sandbox Code Playgroud)
和其他几个组合.
我在单元测试中打印系统属性:
for (String propertyName : new TreeSet<String>(System.getProperties().stringPropertyNames())){
System.out.println(propertyName + ": " + System.getProperty(propertyName));
}
Run Code Online (Sandbox Code Playgroud)
到目前为止唯一有效的是显式值,例如:
<systemPropertyVariables>
<http.proxyHost>myProxy</http.proxyHost>
</systemPropertyVariables>
Run Code Online (Sandbox Code Playgroud)
要么
<argLine>-Dhttp.proxyHost=myProxy</argLine>
Run Code Online (Sandbox Code Playgroud)
但正如我所说,如果可能的话,我不想复制配置.
如何在单元测试中使用settings.xml文件中设置的代理设置?
当我使用maven-jaxb2-plugin生成JAXB类时,我得到了部分(!?)德语Javadoc的类.(我的默认语言环境:de_CH)
我想要的是:英语Javadoc
我试图设置maven opts:-Duser.language=en -Duser.country=US
但它没有效果.
如何使用英文Javadoc生成JAXB类?
以下是部分JAXB类的Javadoc和部分德语Javadoc:http://drombler.sourceforge.net/DromblerACP/docs/site/0.2.1-SNAPSHOT/apidocs/org/drombler/acp/core/action/jaxb/package -frame.html
以下是相应的XSD:http://sourceforge.net/p/drombler/drombler-acp/ci/default/tree/drombler-acp-core-action/src/main/resources/actions.xsd
这是相应的POM:http://sourceforge.net/p/drombler/drombler-acp/ci/default/tree/drombler-acp-core-action/pom.xml
相关的JAXB问题:
https://java.net/jira/browse/JAXB-1001
任何解决方法?
Java 8 Update 40(8u40)的发行说明指出:
已弃用的标准覆盖机制和扩展机制已被弃用,可能会在将来的版本中删除.没有运行时更改.建议使用"认可标准覆盖"或"扩展"机制的现有应用程序远离使用这些机制.
还有一个问题澄清了Jigsaw(计划用于Java SE 9,AFAIK),这将以某种方式用模块化方法取代:
http://bugs.java.com/view_bug.do?bug_id=8065675
我知道Oracle现在想要弃用这些机制,因为它们不再支持它们在Java SE 9中了.
另一方面,在不提供替代方案的情况下弃用某些东西并不是一种好的做法.
发布说明指出:"建议现有应用程序迁移远离使用这些机制"
那么你怎么能"远离"
在Java SE 8中?
我正在寻找使用Spring设置单元和集成测试的最佳实践.
我通常使用3种测试:
目前我只有第二类测试,这是棘手的部分.我设置了一个基础测试类,如:
@ContextConfiguration(locations = { "/my_spring_test.xml" })
public abstract class AbstractMyTestCase extends AbstractJUnit4SpringContextTests
Run Code Online (Sandbox Code Playgroud)
而"单位"测试如下:
public class FooTest extends AbstractMyTestCase
Run Code Online (Sandbox Code Playgroud)
使用自动装配的属性.
在不同(集成测试)环境中运行测试的最佳方法是什么?对测试进行子类化并覆盖ContextConfiguration?
@ContextConfiguration(locations = { "/my_spring_integration_test.xml" })
public class FooIntegrationTest extends FooTest
Run Code Online (Sandbox Code Playgroud)
这会有用吗(我目前无法在这里轻松测试)?这种方法的问题是"@ContextConfiguration(locations = {"/ my_spring_integration_test.xml"})"重复了很多.
有什么建议?
此致,弗洛里安