以“标准”方式使用 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/