有人可以帮我解决这个问题, 发生了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;
}
}
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;
}
}
}
}
快照类 包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;
}
}
答案 0 :(得分:1)
JAX-RS将根据JAX-RS方法返回的内容构建JAXBContext
。然后,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
的其他详细信息:
答案 1 :(得分:0)
感谢@ blaise-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;
}
}
在这里输入代码 现在一切正常。