java - wsimport 生成的 java 中缺少命名空间

标签 java xml jaxb wsdl wsimport

以“标准”方式使用 wsimport 时:

wsimport.exe -d C:/temp/generatedClasses -s C:/temp/sourceFiles C:/temp/myWsdl.wsdl

我得到这样生成的源文件:

@XmlRootElement(name = "PingRequest")
public class PingRequest{

上次生成类时应该使用相同的 WSDL/XSD 并生成如下输出:

@XmlRootElement(name = "PingRequest", namespace = "http://me.foo.bar/any/")
public class PingRequest {

因此模式 namespace 被包含为注释的属性。由于生成的类 package-info.java 具有以下条目:

@javax.xml.bind.annotation.XmlSchema(namespace = "http://me.foo.bar/any", elementFormDefault = javax.xml.bind.annotation.XmlNsForm.QUALIFIED)

我假设添加命名空间属性是通过配置 wsimport/jaxb 模式编译器完成的。

谁能解释一下如何归档包含的命名空间属性?

更新:正如 Blaise 正确回答的(在博客链接中描述),生成的文件 package-info.java 定义了相应包内所有类/类型的 namespace 。如果每个 @RootElement 始终包含相同的命名空间,则以上示例已过时。在@RootElement 级别上设置命名空间可用于让某个@RootElement 拥有自己的命名空间(在 wsimport 的情况下应该自动发生)。

非常感谢任何建议

我尝试了什么:

  • 使用谷歌,找到https://www.java.net/node/681149 (确切地说是我在 2008 年提出的问题)没有答案 :(
  • 阅读 wsimport/jaxb 模式编译器选项,尝试各种只控制包输出的选项
  • 阅读我输入此问题标题时弹出的 12 个类似问题/答案

我发现与命名空间最接近的是在 XSD 本身和我已经完成的 WSDL 中的导入部分中指定“elementFormDefault="qualified"。

最佳答案

在包级别指定以下注释,而不在所有 @XmlElement 上指定命名空间/@XmlRootElement注释。

@javax.xml.bind.annotation.XmlSchema(
    namespace = "http://me.foo.bar/any", 
    elementFormDefault = javax.xml.bind.annotation.XmlNsForm.QUALIFIED)

相当于没有@XmlSchema并添加 namespace所有 @XmlElement 的参数/@XmlRootElement注释。它们将生成/使用相同的 XML 文档。

了解更多信息

关于java - wsimport 生成的 java 中缺少命名空间,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21237127/

相关文章:

java - 集成 Pentaho/Talend/等使用 OR 映射器

java - 正则表达式java来屏蔽

java - Selenium 代码在延迟加载的 Web 元素中水平滚动

xml - XSL 浏览器问题

c# - 将任何用户输入添加为 XML 文档中的节点

java - JAXB:当使用 XML 模式 (.xsd) 验证 XML 文件时,如果验证失败,我能知道是哪个 XML 标记导致的吗?

java - 警告 : unknown enum constant Status. 稳定

html - 2 个空格或 1 个制表符,Rails 社区中的缩进标准是什么?

jaxb - 为 JAXB 生成的类添加前缀

java - JAXB minOccurs=0。元素存在还是不存在?