JAXBException发生:类com.jaxb.model.copy.copy.Snapshot

2019-10-20 03:48发布

有人可以帮我解决这个问题,JAXBException发生:类com.jaxb.model.copy.copy.Snapshot或其任何超类是已知此背景下..

接口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);
}

类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类

    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类包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;
    }

}

も类包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;
                        }
                }
        }
}

快照类包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;
    }
}

Answer 1:

JAX-RS将建成JAXBContext基于JAX-RS方法返回什么。 然后JAXB将通过传递性关系拉进来更多的类。 这并不总是导致所有的类进行处理。 为了获得更多的控制权JAXBContext创建的,你可以创建一个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(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.
    }

}

我提供了关于如何你一些额外的细节JAXBContext应该回答您的相关问题,可以了:

  • 在线程“主要” javax.xml.bind.JAXBException异常:类或其任何超类中是众所周知的这种情况下


Answer 2:

感谢@布莱斯 - doughan。 我有一个类似的问题。 我的SOAP服务工作得很好,但REST应答丢失,因为你提到什么,我已经合并了我目前的实施方案:

@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;
}

}

在此输入代码现在一切都正常工作。



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