spring 从wsdl创建客户端时缺少@XmlRootElement

jk9hmnmh  于 2024-01-05  发布在  Spring
关注(0)|答案(3)|浏览(185)

我有一个关于使用基于第三方WSDL文件的Web服务的问题。
我已经使用了给定的wsdl并生成了所需的120多个java文件。这个过程是通过使用xjc完成的。在Sping环境中,我能够通过调用几个公开的服务成功地创建几个JUnit测试。
但是,为了成功地测试这些服务,我必须向生成的java文件中添加**@XmlRootElement**注解。
“com.sun.istack.SAXException2:无法将类型“com.beam.services.client.UserGetRequestData”封送为元素,因为它缺少@XmlRootElement注解”

我已经搜索了一遍...我无法控制wsdl文件的创建/结构。我该如何生成java文件以确保包含@XmlRootElement注解,或者如何编写客户端代码以避免上述错误?
谢谢

falq053o

falq053o1#

如果你真的需要@XmlRootElement,如果你的类型只用于一个元素,你可以使用简单绑定模式。JAXB默认情况下不包含annotation的原因以及如何使用简单绑定在这里解释:https://web.archive.org/web/20170504081258/https://community.oracle.com/blogs/kohsuke/2006/03/03/why-does-jaxb-put-xmlrootelement-sometimes-not-always
您的模式可能会被XJC现在没有编译的其他模式使用

这种概念在规范中没有定义,但作为一个实验,我们在XJC中有这种积极的优化模式,暂时称为“简单绑定模式”。
当他们移动博客时,样本似乎丢失了,但它看起来像这样:

  1. <xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:jaxb="http://java.sun.com/xml/ns/jaxb" jaxb:version="1.0" xmlns:xjc="http://java.sun.com/xml/ns/jaxb/xjc" jaxb:extensionbindingprefixes="xjc">
  2. <xs:annotation>
  3. <xs:appinfo>
  4. <jaxb:globalbindings>
  5. <xjc:simple/>
  6. </jaxb:globalbindings>
  7. </xs:appinfo>
  8. </xs:annotation>
  9. <xs:element name="foo" type="bar"/>
  10. <xs:complextype name="bar"/>
  11. </xs:schema>

字符串
另一种可能性是将其 Package 在JAXBElement中。ObjectFactory应该包括一个创建这些 Package 对象的方法。

展开查看全部
ergxz8rk

ergxz8rk2#

如果你正在使用mavem然后检查这个链接,它为我工作。
创建Maven项目。下面你可以看到POM:

  1. <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  2. xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
  3. <modelVersion>4.0.0</modelVersion>
  4. <groupId>org.zmeu</groupId>
  5. <artifactId>zmeu-blog-maven-jaxb</artifactId>
  6. <version>1.0-SNAPSHOT</version>
  7. <name>ZMEU Blog Maven JAXB</name>
  8. <build>
  9. <plugins>
  10. <plugin>
  11. <artifactId>maven-compiler-plugin</artifactId>
  12. <configuration>
  13. <source>1.6</source>
  14. <target>1.6</target>
  15. </configuration>
  16. </plugin>
  17. <plugin>
  18. <groupId>org.jvnet.jaxb2.maven2</groupId>
  19. <artifactId>maven-jaxb2-plugin</artifactId>
  20. <version>0.8.0</version>
  21. <configuration>
  22. <schemaDirectory>src/main/resources/schema</schemaDirectory>
  23. <bindingDirectory>src/main/resources/schema</bindingDirectory>
  24. <generatePackage>org.zmeu.blog.jaxb</generatePackage>
  25. <strict>false</strict>
  26. <extension>true</extension>
  27. <plugins>
  28. <plugin>
  29. <groupId>org.jvnet.jaxb2_commons</groupId>
  30. <artifactId>jaxb2-basics</artifactId>
  31. <version>0.6.2</version>
  32. </plugin>
  33. <plugin>
  34. <groupId>org.jvnet.jaxb2_commons</groupId>
  35. <artifactId>jaxb2-basics-annotate</artifactId>
  36. <version>0.6.2</version>
  37. </plugin>
  38. </plugins>
  39. <args>
  40. <arg>-Xannotate</arg>
  41. <arg>-XtoString</arg>
  42. </args>
  43. </configuration>
  44. <executions>
  45. <execution>
  46. <id>generate</id>
  47. <goals>
  48. <goal>generate</goal>
  49. </goals>
  50. </execution>
  51. </executions>
  52. </plugin>
  53. </plugins>
  54. </build>
  55. <dependencies>
  56. <dependency>
  57. <groupId>org.jvnet.jaxb2_commons</groupId>
  58. <artifactId>jaxb2-basics-runtime</artifactId>
  59. <version>0.6.2</version>
  60. </dependency>
  61. </dependencies>
  62. </project>

字符串
编写XML架构(schema.xsd):

  1. <?xml version="1.0" encoding="UTF-8" standalone="yes"?>
  2. <xs:schema version="1.0" xmlns:xs="http://www.w3.org/2001/XMLSchema">
  3. <xs:element name="user" type="user" />
  4. <xs:element name="userList" type="userList" />
  5. <xs:complexType name="user">
  6. <xs:all>
  7. <xs:element name="id" type="xs:long" minOccurs="0" />
  8. <xs:element name="name" type="xs:string" />
  9. <xs:element name="registrationDate" type="xs:dateTime" />
  10. </xs:all>
  11. </xs:complexType>
  12. <xs:complexType name="userList">
  13. <xs:sequence>
  14. <xs:element name="user" type="user" minOccurs="0" maxOccurs="unbounded" />
  15. </xs:sequence>
  16. </xs:complexType>
  17. </xs:schema>


定制JAXB绑定(binding.xjb):

  1. <?xml version="1.0" encoding="UTF-8" standalone="yes"?>
  2. <jaxb:bindings xmlns:jaxb="http://java.sun.com/xml/ns/jaxb" xmlns:xs="http://www.w3.org/2001/XMLSchema"
  3. xmlns:xjc="http://java.sun.com/xml/ns/jaxb/xjc" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  4. xmlns:annox="http://annox.dev.java.net"
  5. xsi:schemaLocation="http://java.sun.com/xml/ns/jaxb http://java.sun.com/xml/ns/jaxb/bindingschema_2_0.xsd"
  6. version="2.1">
  7. <jaxb:globalBindings>
  8. <!-- Use java.util.Calendar instead of javax.xml.datatype.XMLGregorianCalendar for xs:dateTime -->
  9. <jaxb:javaType name="java.util.Calendar" xmlType="xs:dateTime"
  10. parseMethod="javax.xml.bind.DatatypeConverter.parseDateTime"
  11. printMethod="javax.xml.bind.DatatypeConverter.printDateTime" />
  12. <!-- Force all classes implements Serializable -->
  13. <xjc:serializable uid="1" />
  14. </jaxb:globalBindings>
  15. <!-- Annotate the following classes with XmlRootElement -->
  16. <jaxb:bindings schemaLocation="schema.xsd" node="/xs:schema">
  17. <jaxb:bindings node="xs:complexType[@name='user']">
  18. <annox:annotate>
  19. <annox:annotate annox:class="javax.xml.bind.annotation.XmlRootElement" name="user" />
  20. </annox:annotate>
  21. </jaxb:bindings>
  22. <jaxb:bindings node="xs:complexType[@name='userList']">
  23. <annox:annotate>
  24. <annox:annotate annox:class="javax.xml.bind.annotation.XmlRootElement" name="userList" />
  25. </annox:annotate>
  26. </jaxb:bindings>
  27. </jaxb:bindings>
  28. </jaxb:bindings>


使用mvn clean install命令运行构建。构建必须成功。生成的类将位于target/generated-sources/xjc目录中。下面是生成的User类的片段:

  1. @XmlAccessorType(XmlAccessType.FIELD)
  2. @XmlType(name = "user", propOrder = {})
  3. @XmlRootElement(name = "user")
  4. public class User implements Serializable, ToString {
  5. private final static long serialVersionUID = 1L;
  6. protected Long id;
  7. @XmlElement(required = true)
  8. protected String name;
  9. @XmlElement(required = true, type = String.class)
  10. @XmlJavaTypeAdapter(Adapter1 .class)
  11. @XmlSchemaType(name = "dateTime")
  12. protected Calendar registrationDate;
  13. }


你完了!

展开查看全部
im9ewurl

im9ewurl3#

关于使用RestAssured和SpringBootTest测试RestController的问题,我使用的是一个外部源的类Document,它缺少@XMLRootElement注解。
我从Document中扩展了一个带有@XMLRootElement注解的类,缺少注解。然后在SpringBootTest中使用新类,即JAXBDocument来调用我的RestController。
@RequestBody注解使用模型类的getter和setter将整个客户端请求Map到模型类。此Map以前失败过,因为缺少@XMLRootElement。

  1. @XmlRootElement(name = "JAXBDocument")
  2. public class JAXBDocument extends Document{
  3. public JAXBDocument(Document document) {
  4. super.setCstmrCdtTrfInitn(document.getCstmrCdtTrfInitn());
  5. }
  6. public JAXBDocument() {}
  7. }

字符串

相关问题