简体   繁体   中英

JAXBException occurred : class com.jaxb.model.copy.copy.Snapshot nor any of its super class is known to this context..

Can someone help me to resolve the issue, JAXBException occurred : class com.jaxb.model.copy.copy.Snapshot nor any of its super class is known to this context..

Interface JaxbWebResource

package com.jaxb.model.copy.copy;

import javax.servlet.http.HttpServletRequest;
import javax.ws.rs.GET;
import javax.ws.rs.Path;
import javax.ws.rs.PathParam;
import javax.ws.rs.Produces;
import javax.ws.rs.core.Context;
import javax.ws.rs.core.Response;

@Path("/jaxb")
public interface JaxbWebResource
{
    @GET
    @Produces({ "application/xml", "application/json" })
    public Response readOffer(@Context HttpServletRequest req);
}

Class JaxbWebResourceImpl

package com.jaxb.model.copy.copy;

import javax.servlet.http.HttpServletRequest;
import javax.ws.rs.core.Response;
import javax.ws.rs.core.Response.Status;
import javax.xml.bind.JAXBElement;

import org.springframework.stereotype.Component;

import com.jaxb.model.copy.copy.Foo;
import com.jaxb.model.copy.copy.Moo;
import com.jaxb.model.copy.copy.ObjectFactory;
import com.jaxb.model.copy.copy.Snapshot;

@Component("jaxbWebResource")
public class JaxbWebResourceImpl implements JaxbWebResource
{

    @Override
    public Response readOffer(final HttpServletRequest req) {

        System.out.println("JaxbWebResourceImpl readMarketingOffer");
        Snapshot snapshot = new Snapshot();
        Foo.Detail.Bar barV = new Foo.Detail.Bar();
        barV.setBaz("heloo baz");
        JAXBElement<Foo.Detail.Bar> bar = new ObjectFactory().createBar(barV);
        bar.setNil(true);
        Foo.Detail detail = new Foo.Detail();
        detail.setBar(bar);
        Foo foo = new Foo();
        foo.setDetail(detail);
        snapshot.setMoo(foo);

        return Response.status(Status.OK).entity(snapshot).build();

    }

}

ObjectFactory class

    package com.jaxb.model.copy.copy;

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

@XmlRegistry
public class ObjectFactory {

    @XmlElementDecl(namespace="",name="bar")
    public JAXBElement<Moo.Detail.Bar> createBar(Moo.Detail.Bar bar) {
        return new JAXBElement<Moo.Detail.Bar>(new QName("bar"), Moo.Detail.Bar.class, bar);
    }

}

Foo class package com.jaxb.model.copy.copy;

import java.math.BigDecimal;

import javax.xml.bind.JAXBElement;
import javax.xml.bind.annotation.XmlAccessType;
import javax.xml.bind.annotation.XmlAccessorType;
import javax.xml.bind.annotation.XmlAttribute;
import javax.xml.bind.annotation.XmlElement;
import javax.xml.bind.annotation.XmlElementRef;
import javax.xml.bind.annotation.XmlRootElement;
import javax.xml.bind.annotation.XmlSeeAlso;
import javax.xml.bind.annotation.XmlType;
import javax.xml.bind.annotation.XmlValue;

import com.guthyrenker.soma.ws.rest.v1.model.ObjectFactory;
import com.guthyrenker.soma.ws.rest.v1.model.WSMarketingOfferOP;
import com.guthyrenker.soma.ws.rest.v1.model.WSMarketingOfferWEB;
import com.jaxb.model.copy.Snapshot;
import com.jverstry.annotations.generics.Market;

@XmlRootElement
@XmlAccessorType(XmlAccessType.FIELD)

public class Foo extends Moo{

    @XmlElement
   String name;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

}

Moo class package com.jaxb.model.copy.copy;

import java.math.BigDecimal;

import javax.xml.bind.JAXBElement;
import javax.xml.bind.annotation.XmlAccessType;
import javax.xml.bind.annotation.XmlAccessorType;
import javax.xml.bind.annotation.XmlAttribute;
import javax.xml.bind.annotation.XmlElement;
import javax.xml.bind.annotation.XmlElementRef;
import javax.xml.bind.annotation.XmlRootElement;
import javax.xml.bind.annotation.XmlType;
import javax.xml.bind.annotation.XmlValue;

import com.jverstry.annotations.generics.Market;

@XmlRootElement
@XmlAccessorType(XmlAccessType.FIELD)
public class Moo {


     @XmlElement
        protected Detail detail;

        public Detail getDetail() {
            return detail;
        }

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

        @XmlAccessorType(XmlAccessType.FIELD)
        @XmlType(name = "", propOrder = { "bar"})
        public static class Detail
        {
            @XmlElementRef(name="bar")
            private JAXBElement<Foo.Detail.Bar> bar;


                public JAXBElement<Foo.Detail.Bar> getBar() {
                return bar;
            }

            public void setBar(JAXBElement<Foo.Detail.Bar> bar) {
                this.bar = bar;
            }




            @XmlAccessorType(XmlAccessType.FIELD)
            @XmlType(name = "", propOrder = { "value" })
                public static class Bar
                {

                     @XmlAttribute
                     protected String baz;

                     @XmlValue
                        protected BigDecimal value;

                        public String getBaz() {
                            return baz;
                        }

                        public void setBaz(String baz) {
                            this.baz = baz;
                        }

                        public BigDecimal getValue() {
                            return value;
                        }

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

Snapshot class package com.jaxb.model.copy.copy;

import java.util.Date;

import javax.xml.bind.annotation.XmlAccessType;
import javax.xml.bind.annotation.XmlAccessorType;
import javax.xml.bind.annotation.XmlAttribute;
import javax.xml.bind.annotation.XmlElement;
import javax.xml.bind.annotation.XmlRootElement;
import javax.xml.bind.annotation.XmlType;

import com.fasterxml.jackson.annotation.JsonIgnore;
import com.fasterxml.jackson.databind.annotation.JsonSerialize;
import com.guthyrenker.soma.ws.rest.v1.adapter.JsonDateTimeSerializer;
/**
 * @author Srinivasa Kankipati
 * @since 1.0
 */
@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(propOrder = { "mask", "xmlns", "currentAsOf","moo" })
@XmlRootElement(name = "snapshot")
public class Snapshot<T extends Moo>
{
    @XmlAttribute
    public String mask;

    @XmlElement
    public Date currentAsOf;

    @XmlAttribute
    @JsonIgnore
    public String xmlns;

    @XmlElement(name = "moo")
    private Moo moo;

    public String getMask() {
        return mask;
    }

    public void setMask(String mask) {
        this.mask = mask;
    }

    public Date getCurrentAsOf() {
        return currentAsOf;
    }

    public void setCurrentAsOf(Date currentAsOf) {
        this.currentAsOf = currentAsOf;
    }

    public String getXmlns() {
        return xmlns;
    }

    public void setXmlns(String xmlns) {
        this.xmlns = xmlns;
    }

    public Moo getMoo() {
        return moo;
    }

    public void setMoo(Moo moo) {
        this.moo = moo;
    }
}

JAX-RS will build a JAXBContext based on what the JAX-RS method returns. JAXB will then pull in more classes via transitive relationships. This doesn't always cause all the classes to be processed. To get more control over the JAXBContext created you can create a ContextResolver that builds the JAXBContext the way that you want.

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(MediaType.APPLICATION_XML)
public class MyContextResolver implements ContextResolver<JAXBContext> {

    private JAXBContext jc;

    public MyContextResolver() {
        try {
           jc = // Build Your JAXBContext on all classes it needs to be aware of.
        } catch(JAXBException e) {
            throw new RuntimeException(e);
        }
    }

    public JAXBContext getContext(Class<?> clazz) {
       // Return the JAXBContext for any class it is aware of otherwise return null.
    }

}

I have provided some additional details on how your JAXBContext should be built in an answer to your related question:

Thanks to @blaise-doughan. I had a similar problem. My SOAP service worked fine but REST responses were lost because of what you have mentioned and I have merged his solution with my current Implementation:

@Provider
@Service("myManager")
@WebService(serviceName = "MyService", portName = "MyManagerImpl")
public class MyManagerImpl implements    MyService, ContextResolver<JAXBContext> {
private JAXBContext jc;

public MyManagerImpl() {
    try {
        jc = JAXBContext.newInstance(Children.class, MyResponse.class);
    } catch(JAXBException e) {
        throw new RuntimeException(e);
    }

    public JAXBContext getContext(Class<?> aClass) {
        return jc;
}

}

enter code here Now everything work fine.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM