当存在静态类时,没有带有@XmlElementDecl的ObjectFactory [英] There's no ObjectFactory with an @XmlElementDecl when there is static class

查看:181
本文介绍了当存在静态类时,没有带有@XmlElementDecl的ObjectFactory的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

I am getting below exception, i need some help to resolve the issue.


If remove the namespace in the object factory and with out package-info.java class it is working fine.



           Exception that is throwing now                 


        Exception in thread "main" com.sun.xml.bind.v2.runtime.IllegalAnnotationsException: 1 counts of IllegalAnnotationExceptions
        There's no ObjectFactory with an @XmlElementDecl for the element {}shipping.
        this problem is related to the following location:
        at protected javax.xml.bind.JAXBElement com.jverstry.annotations.generics.Market$Detail.shipping
        at com.jverstry.annotations.generics.Market$Detail
        at protected com.jverstry.annotations.generics.Market$Detail com.jverstry.annotations.generics.Market.detail
        at com.jverstry.annotations.generics.Market

创建jaxbelement的ObjectFactory类

ObjectFactory class which is creating the jaxbelement

    package com.jverstry.annotations.generics;
    import javax.xml.bind.JAXBElement;
    import javax.xml.bind.annotation.XmlElementDecl;
    import javax.xml.bind.annotation.XmlRegistry;
    import javax.xml.namespace.QName;

    import org.example.customer.Customer;

    @XmlRegistry
    public class ObjectFactory {


        public ObjectFactory() {
        }

       public Market.Detail.Shipping createShipping() {
            return new Market.Detail.Shipping();
        }

        private final static QName _Shipping_QNAME = new QName("http://www.example.org/customer", "shipping");

    @XmlElementDecl(namespace = "http://www.example.org/customer", name = "shipping")
    public JAXBElement<Market.Detail.Shipping> createShipping(Market.Detail.Shipping value) {
        return new JAXBElement<Market.Detail.Shipping>(_Shipping_QNAME, Market.Detail.Shipping.class, value);
    }

  }

类package-info.java,其中为响应提及名称空格xml

Class package-info.java, where the name spaces are mentioned for the response xml

          @XmlSchema(namespace = "http://www.example.org/customer", elementFormDefault = XmlNsForm.QUALIFIED)
         package com.jverstry.annotations.generics;

         import javax.xml.bind.annotation.*;

模拟对象的演示类

      package com.jverstry.annotations.generics;

      import javax.xml.bind.JAXBContext;
      import javax.xml.bind.JAXBElement;
      import javax.xml.bind.Marshaller;

         public class Demo {

          public static void main(String[] args) throws Exception {
            JAXBContext jc = JAXBContext.newInstance(Market.class);

            Market market = new Market();  
            Market.Detail md = new Market.Detail();

            Market.Detail.Shipping mds = new  Market.Detail.Shipping();
            mds.setAvailable(false);

            JAXBElement<Market.Detail.Shipping> shipping = new ObjectFactory().createShipping(mds);
            shipping.setNil(true); 
            md.setShipping(shipping);
            market.setDetail(md);

            Marshaller marshaller = jc.createMarshaller();
            marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);
            marshaller.marshal(market, System.out);
        }

    }

市场类,这是主要的创建jaxbcontext的root类

Market class, this is the main root class where jaxbcontext is created

    package com.jverstry.annotations.generics;

    import java.math.BigDecimal;

    import javax.xml.bind.JAXBElement;
    import javax.xml.bind.annotation.*;

    @XmlAccessorType(XmlAccessType.FIELD)
    @XmlType(name = "", propOrder = { "detail" })
    @XmlRootElement(name = "Market")
    public class Market
    {

        @XmlElement(required = false)
        protected Market.Detail detail;

        public Market.Detail getDetail() {
            return detail;
        }

        public void setDetail(Market.Detail detail) {
            this.detail = detail;
        }

        @XmlAccessorType(XmlAccessType.FIELD)
        @XmlType(name = "", propOrder = { "shipping" })
        public static class Detail
        {
            @XmlElementRef(name = "shipping")
            protected JAXBElement<Market.Detail.Shipping> shipping;

            public JAXBElement<Market.Detail.Shipping> getShipping() {
                return shipping;
            }

            public void setShipping(JAXBElement<Market.Detail.Shipping> value) {
                this.shipping = value;
            }

            @XmlAccessorType(XmlAccessType.FIELD)
            @XmlType(name = "", propOrder = { "value" })
            public static class Shipping
            {
                @XmlValue
                protected BigDecimal value;

                @XmlAttribute(name = "available")
                protected Boolean available;

                public BigDecimal getValue() {
                    return value;
                }

                public void setValue(BigDecimal value) {
                    this.value = value;
                }

                public Boolean getAvailable() {
                    return available;
                }

                public void setAvailable(Boolean value) {
                    this.available = value;
                }
            }
        }
    }


推荐答案

您需要通过传递 ObjectFactory 类或包来创建 JAXBContext 生成的模型的名称,以确保处理 ObjectFactory 类。

You need to create the JAXBContext by passing in the ObjectFactory class or the package name of the generated model to ensure the ObjectFactory class is processed.

如果指定 @XmlElementRef 注释事项应该有效的> namespace 属性。

If you specify the namespace property on the @XmlElementRef annotation things should work.

这篇关于当存在静态类时,没有带有@XmlElementDecl的ObjectFactory的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆