java 没有带有 @XmlElementDecl 的 ObjectFactory

声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow 原文地址: http://stackoverflow.com/questions/12074317/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me): StackOverFlow

提示:将鼠标放在中文语句上可以显示对应的英文。显示中英文
时间:2020-10-31 07:29:25  来源:igfitidea点击:

There's no ObjectFactory with an @XmlElementDecl

javajaxbglassfishjax-ws

提问by Alexey Savchuk

To deploy in GlassFish Server Open Source Edition 3.1.1 (build 12):

要在 GlassFish Server 开源版 3.1.1(内部版本 12)中进行部署:

Caused by: java.security.PrivilegedActionException: com.sun.xml.bind.v2.runtime.IllegalAnnotationsException: 1 counts of IllegalAnnotationExceptions There's no ObjectFactory with an @XmlElementDecl for the element {http://www.w3.org/2004/08/xop/include}Include. this problem is related to the following location: at protected java.util.List ru.gosuslugi.smev.rev120315.ReferenceType.content at ru.gosuslugi.smev.rev120315.ReferenceType at public javax.xml.bind.JAXBElement ru.gosuslugi.smev.rev120315.ObjectFactory.createReference(ru.gosuslugi.smev.rev120315.ReferenceType) at ru.gosuslugi.smev.rev120315.ObjectFactory at protected java.util.List ru.gosuslugi.smev.rev120315.AppDataType.any at ru.gosuslugi.smev.rev120315.AppDataType at protected ru.gosuslugi.smev.rev120315.AppDataType ru.gosuslugi.smev.rev120315.MessageDataType.appData at ru.gosuslugi.smev.rev120315.MessageDataType at protected ru.gosuslugi.smev.rev120315.MessageDataType ru.gosuslugi.smev.rev120315.BaseMessageType.messageData at ru.gosuslugi.smev.rev120315.BaseMessageType

引起:java.security.PrivilegedActionException: com.sun.xml.bind.v2.runtime.IllegalAnnotationsException: 1 counts of IllegalAnnotationExceptions 没有带有 @XmlElementDecl 元素的 ObjectFactory {http://www.w3.org/2004/ 08/xop/include}包括。此问题与以下位置有关:at protected java.util.List ru.gosuslugi.smev.rev120315.ReferenceType.content at ru.gosuslugi.smev.rev120315.ReferenceType at public javax.xml.bind.JAXBElement ru.gosuslugi。 smev.rev120315.ObjectFactory.createReference(ru.gosuslugi.smev.rev120315.ReferenceType) at ru.gosuslugi.smev.rev120315.ObjectFactory at protected java.util.List ru.gosuslugi.smev.rev120315.AppDataType.any .smev.rev120315。

Sources:

资料来源:

src/org/w3/_2004/_08/xop/include/Include.java

src/org/w3/_2004/_08/xop/include/Include.java

//
// This file was generated by the JavaTM Architecture for XML Binding(JAXB) Reference Implementation, v2.2.4-2 
// See <a href="http://java.sun.com/xml/jaxb">http://java.sun.com/xml/jaxb</a> 
// Any modifications to this file will be lost upon recompilation of the source schema. 
// Generated on: 2012.08.22 at 04:13:30 PM MSK 
//


package org.w3._2004._08.xop.include;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import javax.xml.bind.annotation.XmlAccessType;
import javax.xml.bind.annotation.XmlAccessorType;
import javax.xml.bind.annotation.XmlAnyAttribute;
import javax.xml.bind.annotation.XmlAnyElement;
import javax.xml.bind.annotation.XmlAttribute;
import javax.xml.bind.annotation.XmlSchemaType;
import javax.xml.bind.annotation.XmlType;
import javax.xml.namespace.QName;


/**
 * <p>Java class for Include complex type.
 * 
 * <p>The following schema fragment specifies the expected content contained within this class.
 * 
 * <pre>
 * &lt;complexType name="Include">
 *   &lt;complexContent>
 *     &lt;restriction base="{http://www.w3.org/2001/XMLSchema}anyType">
 *       &lt;sequence>
 *         &lt;any namespace='##other' maxOccurs="unbounded" minOccurs="0"/>
 *       &lt;/sequence>
 *       &lt;attribute name="href" use="required" type="{http://www.w3.org/2001/XMLSchema}anyURI" />
 *       &lt;anyAttribute namespace='##other'/>
 *     &lt;/restriction>
 *   &lt;/complexContent>
 * &lt;/complexType>
 * </pre>
 * 
 * 
 */
@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(name = "Include", propOrder = {
    "any"
})
public class Include {

    @XmlAnyElement(lax = true)
    protected List<Object> any;
    @XmlAttribute(name = "href", required = true)
    @XmlSchemaType(name = "anyURI")
    protected String href;
    @XmlAnyAttribute
    private Map<QName, String> otherAttributes = new HashMap<QName, String>();

    /**
     * Gets the value of the any property.
     * 
     * <p>
     * This accessor method returns a reference to the live list,
     * not a snapshot. Therefore any modification you make to the
     * returned list will be present inside the JAXB object.
     * This is why there is not a <CODE>set</CODE> method for the any property.
     * 
     * <p>
     * For example, to add a new item, do as follows:
     * <pre>
     *    getAny().add(newItem);
     * </pre>
     * 
     * 
     * <p>
     * Objects of the following type(s) are allowed in the list
     * {@link Object }
     * 
     * 
     */
    public List<Object> getAny() {
        if (any == null) {
            any = new ArrayList<Object>();
        }
        return this.any;
    }

    /**
     * Gets the value of the href property.
     * 
     * @return
     *     possible object is
     *     {@link String }
     *     
     */
    public String getHref() {
        return href;
    }

    /**
     * Sets the value of the href property.
     * 
     * @param value
     *     allowed object is
     *     {@link String }
     *     
     */
    public void setHref(String value) {
        this.href = value;
    }

    /**
     * Gets a map that contains attributes that aren't bound to any typed property on this class.
     * 
     * <p>
     * the map is keyed by the name of the attribute and 
     * the value is the string value of the attribute.
     * 
     * the map returned by this method is live, and you can add new attribute
     * by updating the map directly. Because of this design, there's no setter.
     * 
     * 
     * @return
     *     always non-null
     */
    public Map<QName, String> getOtherAttributes() {
        return otherAttributes;
    }

}

org/w3/_2004/_08/xop/include/ObjectFactory.java

org/w3/_2004/_08/xop/include/ObjectFactory.java

//
// This file was generated by the JavaTM Architecture for XML Binding(JAXB) Reference Implementation, v2.2.4-2 
// See <a href="http://java.sun.com/xml/jaxb">http://java.sun.com/xml/jaxb</a> 
// Any modifications to this file will be lost upon recompilation of the source schema. 
// Generated on: 2012.08.22 at 04:13:30 PM MSK 
//


package org.w3._2004._08.xop.include;

import javax.xml.bind.JAXBElement;
import javax.xml.bind.annotation.XmlElementDecl;
import javax.xml.bind.annotation.XmlRegistry;
import javax.xml.namespace.QName;


/**
 * This object contains factory methods for each 
 * Java content interface and Java element interface 
 * generated in the org.w3._2004._08.xop.include package. 
 * <p>An ObjectFactory allows you to programatically 
 * construct new instances of the Java representation 
 * for XML content. The Java representation of XML 
 * content can consist of schema derived interfaces 
 * and classes representing the binding of schema 
 * type definitions, element declarations and model 
 * groups.  Factory methods for each of these are 
 * provided in this class.
 * 
 */
@XmlRegistry
public class ObjectFactory {

    private final static QName _Include_QNAME = new QName("http://www.w3.org/2004/08/xop/include", "Include");

    /**
     * Create a new ObjectFactory that can be used to create new instances of schema derived classes for package: org.w3._2004._08.xop.include
     * 
     */
    public ObjectFactory() {
    }

    /**
     * Create an instance of {@link Include }
     * 
     */
    public Include createInclude() {
        return new Include();
    }

    /**
     * Create an instance of {@link JAXBElement }{@code <}{@link Include }{@code >}}
     * 
     */
    @XmlElementDecl(namespace = "http://www.w3.org/2004/08/xop/include", name = "Include")
    public JAXBElement<Include> createInclude(Include value) {
        return new JAXBElement<Include>(_Include_QNAME, Include.class, null, value);
    }

}

回答by bdoughan

When a JAXB model is generated from an XML schema, I always recommend creating the JAXBContextusing the package name of the generated model.

当从 XML 模式生成 JAXB 模型时,我总是建议JAXBContext使用生成的模型的包名称创建。

JAXBContext jc = JAXBContext.newInstance("org.w3._2004._08.xop.include");

You don't specify what kind of application you are deploying to GlassFish, but if it is a JAX-RS/Jersey application I would recommend the use of a ContextResolver. This is a standard mechanism that gives you greater control over how your JAXBContextis created. Below is an example.

您没有指定要部署到 GlassFish 的应用程序类型,但如果它是 JAX-RS/Jersey 应用程序,我建议使用ContextResolver. 这是一种标准机制,可让您更好地控制自己JAXBContext的创建方式。下面是一个例子。

import java.util.*;
import javax.ws.rs.Produces;
import javax.ws.rs.ext.*;
import javax.xml.bind.*;
import org.eclipse.persistence.jaxb.JAXBContextFactory;

@Provider
@Produces({"application/xml", "application/json"})
public class SampleContextResolver implements ContextResolver<JAXBContext> {

    private JAXBContext jc;

    public SampleContextResolver() {
        try {
            jc = JAXBContext.newInstance("org.w3._2004._08.xop.include");
        } catch(JAXBException e) {
            throw new RuntimeException(e);
        }
    }

    public JAXBContext getContext(Class<?> clazz) {
        if(clazz.getPackage().getName().equals("org.w3._2004._08.xop.include")) {
            return jc;
        }
        return null;
    }

}

回答by ioikka

I faced exactly the same issue 6 months ago and honestly I don't remember how it was solved (probably we didn't need some functionality so we put it aside). But today once again our lovely stacktrace cursed with the message (literally like yours)

6 个月前我遇到了完全相同的问题,老实说我不记得它是如何解决的(可能我们不需要某些功能,所以我们把它放在一边)。但是今天我们可爱的堆栈跟踪再次被这条消息诅咒(字面上就像你的一样)

But this time I was able to deal with it.

但这一次我能够处理它。

There's nothing wrong with Include class. But somehow, and that's my guess, it doesn't get loaded properly for jaxb, or not at the time we need it, or ... whatever.

Include 类没有任何问题。但不知何故,这是我的猜测,它没有为 jaxb 正确加载,或者在我们需要它的时候没有加载,或者......无论如何。

What I was trying to do in my code is to validate a payload of the soap message.

我试图在我的代码中做的是验证soap消息的有效负载。

    JAXBContext jaxbContext = JAXBContext.newInstance(UnifoTransferMsg.class) ;
    SchemaFactory schemaFactory = SchemaFactory.newInstance(XMLConstants.W3C_XML_SCHEMA_NS_URI);
    Schema schema = schemaFactory.newSchema(new File("UnifoTransferMsg.xsd"));

    Marshaller marshaller = jaxbContext.createMarshaller();
    marshaller.setSchema(schema);
    marshaller.marshal(inputmsg, System.out);

Spare me for the hardcoded values, it's just for debugging. Nonetheless the first line is where the exception is thrown because Jaxb somehow knows nothing about Include or uses the wrong class. To fix it one needs to load multiple classes at the same call.

给我留些硬编码值,它只是为了调试。尽管如此,第一行是抛出异常的地方,因为 Jaxb 不知何故对 Include 一无所知或使用了错误的类。要修复它,需要在同一个调用中加载多个类。

So the ultimate fix for me was

所以对我来说最终的解决办法是

JAXBContext.newInstance(Include.class, UnifoTransferMsg.class);

Hope that helps and maybe one day i'll expand more on the real cause of the problem.

希望这会有所帮助,也许有一天我会详细说明问题的真正原因。

回答by vikas

You can try putting @XmlRoolElement annotation on generate Include class.

您可以尝试将 @XmlRoolElement 注释放在生成 Include 类上。