简体   繁体   English

发生JAXBException:此上下文已知com.jaxb.model.copy.copy.Snapshot类或其任何超类。

[英]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.. 有人可以帮我解决此问题吗,发生JAXBException:此上下文已知com.jaxb.model.copy.copy.Snapshot类或其任何超类。

Interface JaxbWebResource 接口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 类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 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 class package com.jaxb.model.copy.copy; 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;
    }

}

Moo class package com.jaxb.model.copy.copy; Moo类包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; 快照类包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. JAX-RS将基于JAX-RS方法返回的内容来构建JAXBContext JAXB will then pull in more classes via transitive relationships. 然后,JAXB将通过传递关系引入更多类。 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. 要获得对创建的JAXBContext更多控制,可以创建一个ContextResolver ,该JAXBContext以所需的方式构建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.
    }

}

I have provided some additional details on how your JAXBContext should be built in an answer to your related question: 在回答相关问题时,我提供了一些有关应如何构建JAXBContext其他详细信息:

Thanks to @blaise-doughan. 感谢@ 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: 我的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;
}

}

enter code here Now everything work fine. 在这里输入代码现在一切正常。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

相关问题 JAXBException: SaveButton 或其任何超类在此上下文中都是已知的 - JAXBException: SaveButton nor any of its super class is known to this context JAXBException UnmarshallerImpl或其任何超类对此上下文都是已知的 - JAXBException UnmarshallerImpl nor any of its super class is known to this context JAXB ANY 元素添加编组错误 javax.xml.bind.JAXBException: class *** 或其任何超类在此上下文中都是已知的 - JAXB ANY element add marhalling error javax.xml.bind.JAXBException: class *** nor any of its super class is known to this context JAXB问题 - 类......或者它的任何超类都是这个上下文已知的 - JAXB Issue — class … nor any of its super class is known to this context JAXB“在此上下文中也不知道其任何超类”,避免使用@XmlSeeAlso - JAXB “nor any of its super class is known to this context” avoid @XmlSeeAlso 在jaxb中此上下文也不知道其任何超类 - nor any of its super class is known to this context in jaxb Java 11 + Spring Boot + HATEOAS + JAXBException:类***或其任何超类对此上下文都是已知的 - Java 11 + Spring Boot + HATEOAS + JAXBException: Class *** nor any of its super class is known to this context javax.xml.bind.JAXBException: Class *** 它的任何超级 class 在此上下文中都是已知的 - javax.xml.bind.JAXBException: Class *** nor any of its super class is known to this context 由以下原因引起:javax.xml.bind.JAXBException:该上下文不知道此类或其任何超类 - Caused by: javax.xml.bind.JAXBException: class nor any of its super class is known to this context 编组错误:javax.xml.bind.JAXBException:此上下文已知类或其任何超类 - Marshalling error: javax.xml.bind.JAXBException: class nor any of its super class is known to this context
 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM