[英]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.