【问题标题】:XML unable to create JAXBContext on marshal [duplicate]XML 无法在编组上创建 JAXBContext [重复]
【发布时间】:2023-04-06 00:54:01
【问题描述】:

我有一个 POJO(在 Kotlin 中),我想将其更改为 XML,但在通过 JAXBContext.newInstance(myObj::class.java) 部分时遇到问题

用Java/Kotlin也可以查看/回复

这是我的编组代码

val context = JAXBContext.newInstance(WxPayOrder::class.java)
val m = context.createMarshaller()

m.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true)

val sw = StringWriter()
m.marshal(wxPayOrderWithSign, sw)
val xmlString = sw.toString()

这是我在 POJO 或数据类上的代码(我都试过了,没有/没有 @XmlType & @XmlElement ON)

@XmlRootElement(name = "WxPayOrder")
@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(propOrder = arrayOf("appid","attach","body","detail"))
data class  WxPayOrder (

        @XmlElement(name = "appid")
        var appid: String,

        @XmlElement(name = "attach")
        var attach: String? = null,

        @XmlElement(name = "body")
        var body: String,

        @XmlElement(name = "detail")
        var detail: String? = null,
)

这是我得到的错误(我个人认为这没有提供足够的信息,我看到其他遇到此错误的人也带有重复的名称等。但不是我的)

com.sun.xml.bind.v2.runtime.IllegalAnnotationsException: 1 counts of IllegalAnnotationExceptions
    at com.sun.xml.bind.v2.runtime.IllegalAnnotationsException$Builder.check(IllegalAnnotationsException.java:106)
    at com.sun.xml.bind.v2.runtime.JAXBContextImpl.getTypeInfoSet(JAXBContextImpl.java:471)
    at com.sun.xml.bind.v2.runtime.JAXBContextImpl.<init>(JAXBContextImpl.java:303)
    at com.sun.xml.bind.v2.runtime.JAXBContextImpl.<init>(JAXBContextImpl.java:139)
    at com.sun.xml.bind.v2.runtime.JAXBContextImpl$JAXBContextBuilder.build(JAXBContextImpl.java:1156)
    at com.sun.xml.bind.v2.ContextFactory.createContext(ContextFactory.java:165)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:498)
    at javax.xml.bind.ContextFinder.newInstance(ContextFinder.java:247)

这是我的 pom.xml 的一部分(我只包含其中的一部分,因为我害怕我遗漏了一些重要的东西,你们可能会看到它)

<!-- https://mvnrepository.com/artifact/com.sun.xml.bind/jaxb-core -->
        <dependency>
            <groupId>com.sun.xml.bind</groupId>
            <artifactId>jaxb-core</artifactId>
            <version>2.3.0</version>
        </dependency>


        <!-- https://mvnrepository.com/artifact/javax.xml.bind/jaxb-api -->
        <dependency>
            <groupId>javax.xml.bind</groupId>
            <artifactId>jaxb-api</artifactId>
            <version>2.3.0</version>
        </dependency>

        <!-- https://mvnrepository.com/artifact/com.sun.xml.bind/jaxb-impl -->
        <dependency>
            <groupId>com.sun.xml.bind</groupId>
            <artifactId>jaxb-impl</artifactId>
            <version>2.3.0</version>
        </dependency>

我对 Kotlin 和 JAXB 还是很陌生。提前致谢。

【问题讨论】:

  • 您已经问过类似的问题...问题的实际原因是相同的。还请查看您过去提出的问题的答案。有时,如果您对他们投赞成票或将其标记为已解决,如果答案有帮助,其他人可能会发现它很有用。实际上,在这种情况下,它是您当前问题的解决方案;-)

标签: java xml kotlin jaxb marshalling


【解决方案1】:

JAXB 需要无参数构造函数才能工作。也许在你的堆栈跟踪/日志中的某个地方也写过......但也许不是。

当您使用数据类时,解决此问题的最简单方法是添加no-arg-constructor,如下所示:

@XmlRootElement
data class WxPayOrder (
        // all the properties
) {
  // the no-arg-constructor is a must:
  constructor() : this("", body = "", /* all the other properties that must have a value, setting them to a default one */)
}

如果它是一个“简单”class,你也可以使用类似的东西:

@XmlRootElement
class WxPayOrder() { // actually now this line contains the no-arg constructor
   // your properties
   lateinit var demo : String
   // your custom constructors
   constructor(demo : String) : this() {
     this.demo = demo
   }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-11-06
    • 2018-08-05
    • 2014-11-21
    • 1970-01-01
    • 1970-01-01
    • 2018-07-15
    • 2013-04-05
    • 2017-03-24
    相关资源
    最近更新 更多