JaxbRepresentation给出错误“不包含ObjectFactory.class或jaxb.in​​dex”

我正在尝试创建一个将对象转换为JaxbRepresentation的示例测试应用程序。 但是当我尝试运行它时,它会给我一个错误。

Main.java文件

package test_jaxb; import org.restlet.Server; import org.restlet.data.Protocol; public class Main { /** * @param args the command line arguments */ public static void main(String[] args) throws Exception { Server helloServer = new Server(Protocol.HTTP, 8111, TestResource.class); helloServer.start(); } } 

TestResource.java文件

 package test_jaxb; import org.restlet.ext.jaxb.JaxbRepresentation; import org.restlet.representation.Representation; import org.restlet.resource.ResourceException; import org.restlet.resource.ServerResource; public class TestResource extends ServerResource{ @Override protected Representation get() throws ResourceException { SampleResponse res = new SampleResponse(); res.setMsg("Success"); res.setStatusCode(0); JaxbRepresentation representation = new JaxbRepresentation(res); return representation; } } 

SampleResponse.java文件

 package test_jaxb; import javax.xml.bind.annotation.XmlElement; import javax.xml.bind.annotation.XmlRootElement; @XmlRootElement(name="Response") public class SampleResponse { private int statusCode; private String msg; @XmlElement(name="Msg") public String getMsg() { return msg; } public void setMsg(String msg) { this.msg = msg; } @XmlElement(name="StatusCode") public int getStatusCode() { return statusCode; } public void setStatusCode(int statusCode) { this.statusCode = statusCode; } } 

当我在服务器上运行它时,它会抛出以下错误:

 WARNING: Problem creating Marshaller javax.xml.bind.JAXBException: "test_jaxb" doesnt contain ObjectFactory.class or jaxb.index at com.sun.xml.internal.bind.v2.ContextFactory.createContext(ContextFactory.java:119) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25) at java.lang.reflect.Method.invoke(Method.java:597) at javax.xml.bind.ContextFinder.newInstance(ContextFinder.java:132) at javax.xml.bind.ContextFinder.find(ContextFinder.java:299) at javax.xml.bind.JAXBContext.newInstance(JAXBContext.java:372) at javax.xml.bind.JAXBContext.newInstance(JAXBContext.java:337) at org.restlet.ext.jaxb.JaxbRepresentation.getContext(JaxbRepresentation.java:83) at org.restlet.ext.jaxb.internal.Marshaller$1.initialValue(Marshaller.java:68) at org.restlet.ext.jaxb.internal.Marshaller$1.initialValue(Marshaller.java:64) at java.lang.ThreadLocal.setInitialValue(ThreadLocal.java:141) at java.lang.ThreadLocal.get(ThreadLocal.java:131) at org.restlet.ext.jaxb.internal.Marshaller.getMarshaller(Marshaller.java:163) at org.restlet.ext.jaxb.internal.Marshaller.marshal(Marshaller.java:216) at org.restlet.ext.jaxb.JaxbRepresentation.write(JaxbRepresentation.java:527) at org.restlet.representation.WriterRepresentation.write(WriterRepresentation.java:104) at org.restlet.engine.http.connector.Connection.writeMessageBody(Connection.java:873) at org.restlet.engine.http.connector.Connection.writeMessage(Connection.java:818) at org.restlet.engine.http.connector.ServerConnection.writeMessage(ServerConnection.java:334) at org.restlet.engine.http.connector.Connection.writeMessages(Connection.java:954) at org.restlet.engine.http.connector.BaseServerHelper.handleOutbound(BaseServerHelper.java:201) at org.restlet.engine.http.connector.BaseHelper.handleNextOutbound(BaseHelper.java:425) at org.restlet.engine.http.connector.BaseServerHelper.handleInbound(BaseServerHelper.java:174) at org.restlet.engine.http.connector.BaseHelper.handleNextInbound(BaseHelper.java:418) at org.restlet.engine.http.connector.Connection.readMessages(Connection.java:695) at org.restlet.engine.http.connector.Controller$2.run(Controller.java:95) at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:885) at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:907) at java.lang.Thread.run(Thread.java:619) May 16, 2011 7:05:12 AM org.restlet.ext.jaxb.internal.Marshaller getMarshaller WARNING: Unable to locate marshaller. May 16, 2011 7:05:12 AM org.restlet.ext.jaxb.JaxbRepresentation write WARNING: JAXB marshalling error caught. javax.xml.bind.JAXBException: Unable to locate marshaller. at org.restlet.ext.jaxb.internal.Marshaller.getMarshaller(Marshaller.java:166) at org.restlet.ext.jaxb.internal.Marshaller.marshal(Marshaller.java:216) at org.restlet.ext.jaxb.JaxbRepresentation.write(JaxbRepresentation.java:527) at org.restlet.representation.WriterRepresentation.write(WriterRepresentation.java:104) at org.restlet.engine.http.connector.Connection.writeMessageBody(Connection.java:873) at org.restlet.engine.http.connector.Connection.writeMessage(Connection.java:818) at org.restlet.engine.http.connector.ServerConnection.writeMessage(ServerConnection.java:334) at org.restlet.engine.http.connector.Connection.writeMessages(Connection.java:954) at org.restlet.engine.http.connector.BaseServerHelper.handleOutbound(BaseServerHelper.java:201) at org.restlet.engine.http.connector.BaseHelper.handleNextOutbound(BaseHelper.java:425) at org.restlet.engine.http.connector.BaseServerHelper.handleInbound(BaseServerHelper.java:174) at org.restlet.engine.http.connector.BaseHelper.handleNextInbound(BaseHelper.java:418) at org.restlet.engine.http.connector.Connection.readMessages(Connection.java:695) at org.restlet.engine.http.connector.Controller$2.run(Controller.java:95) at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:885) at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:907) at java.lang.Thread.run(Thread.java:619) May 16, 2011 7:05:12 AM org.restlet.ext.jaxb.internal.Marshaller$1 initialValue WARNING: Problem creating Marshaller javax.xml.bind.JAXBException: "failure" doesnt contain ObjectFactory.class or jaxb.index at com.sun.xml.internal.bind.v2.ContextFactory.createContext(ContextFactory.java:119) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25) at java.lang.reflect.Method.invoke(Method.java:597) at javax.xml.bind.ContextFinder.newInstance(ContextFinder.java:132) at javax.xml.bind.ContextFinder.find(ContextFinder.java:299) at javax.xml.bind.JAXBContext.newInstance(JAXBContext.java:372) at javax.xml.bind.JAXBContext.newInstance(JAXBContext.java:337) at org.restlet.ext.jaxb.JaxbRepresentation.getContext(JaxbRepresentation.java:83) at org.restlet.ext.jaxb.internal.Marshaller$1.initialValue(Marshaller.java:68) at org.restlet.ext.jaxb.internal.Marshaller$1.initialValue(Marshaller.java:64) at java.lang.ThreadLocal.setInitialValue(ThreadLocal.java:141) at java.lang.ThreadLocal.get(ThreadLocal.java:131) at org.restlet.ext.jaxb.internal.Marshaller.getMarshaller(Marshaller.java:163) at org.restlet.ext.jaxb.internal.Marshaller.marshal(Marshaller.java:216) at org.restlet.ext.jaxb.JaxbRepresentation.write(JaxbRepresentation.java:535) at org.restlet.representation.WriterRepresentation.write(WriterRepresentation.java:104) at org.restlet.engine.http.connector.Connection.writeMessageBody(Connection.java:873) at org.restlet.engine.http.connector.Connection.writeMessage(Connection.java:818) at org.restlet.engine.http.connector.ServerConnection.writeMessage(ServerConnection.java:334) at org.restlet.engine.http.connector.Connection.writeMessages(Connection.java:954) at org.restlet.engine.http.connector.BaseServerHelper.handleOutbound(BaseServerHelper.java:201) at org.restlet.engine.http.connector.BaseHelper.handleNextOutbound(BaseHelper.java:425) at org.restlet.engine.http.connector.BaseServerHelper.handleInbound(BaseServerHelper.java:174) at org.restlet.engine.http.connector.BaseHelper.handleNextInbound(BaseHelper.java:418) at org.restlet.engine.http.connector.Connection.readMessages(Connection.java:695) at org.restlet.engine.http.connector.Controller$2.run(Controller.java:95) at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:885) at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:907) at java.lang.Thread.run(Thread.java:619) May 16, 2011 7:05:12 AM org.restlet.ext.jaxb.internal.Marshaller getMarshaller WARNING: Unable to locate marshaller. May 16, 2011 7:05:12 AM org.restlet.engine.http.connector.Connection writeMessage WARNING: Exception while writing the message body. java.io.IOException: Unable to locate marshaller. at org.restlet.ext.jaxb.JaxbRepresentation.write(JaxbRepresentation.java:539) at org.restlet.representation.WriterRepresentation.write(WriterRepresentation.java:104) at org.restlet.engine.http.connector.Connection.writeMessageBody(Connection.java:873) at org.restlet.engine.http.connector.Connection.writeMessage(Connection.java:818) at org.restlet.engine.http.connector.ServerConnection.writeMessage(ServerConnection.java:334) at org.restlet.engine.http.connector.Connection.writeMessages(Connection.java:954) at org.restlet.engine.http.connector.BaseServerHelper.handleOutbound(BaseServerHelper.java:201) at org.restlet.engine.http.connector.BaseHelper.handleNextOutbound(BaseHelper.java:425) at org.restlet.engine.http.connector.BaseServerHelper.handleInbound(BaseServerHelper.java:174) at org.restlet.engine.http.connector.BaseHelper.handleNextInbound(BaseHelper.java:418) at org.restlet.engine.http.connector.Connection.readMessages(Connection.java:695) at org.restlet.engine.http.connector.Controller$2.run(Controller.java:95) at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:885) at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:907) at java.lang.Thread.run(Thread.java:619) May 16, 2011 7:05:12 AM org.restlet.engine.http.connector.ServerConnection writeMessage INFO: An exception occured while writing the response java.io.IOException: Unable to locate marshaller. at org.restlet.ext.jaxb.JaxbRepresentation.write(JaxbRepresentation.java:539) at org.restlet.representation.WriterRepresentation.write(WriterRepresentation.java:104) at org.restlet.engine.http.connector.Connection.writeMessageBody(Connection.java:873) at org.restlet.engine.http.connector.Connection.writeMessage(Connection.java:818) at org.restlet.engine.http.connector.ServerConnection.writeMessage(ServerConnection.java:334) at org.restlet.engine.http.connector.Connection.writeMessages(Connection.java:954) at org.restlet.engine.http.connector.BaseServerHelper.handleOutbound(BaseServerHelper.java:201) at org.restlet.engine.http.connector.BaseHelper.handleNextOutbound(BaseHelper.java:425) at org.restlet.engine.http.connector.BaseServerHelper.handleInbound(BaseServerHelper.java:174) at org.restlet.engine.http.connector.BaseHelper.handleNextInbound(BaseHelper.java:418) at org.restlet.engine.http.connector.Connection.readMessages(Connection.java:695) at org.restlet.engine.http.connector.Controller$2.run(Controller.java:95) at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:885) at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:907) at java.lang.Thread.run(Thread.java:619) 

请有人帮忙!!!

要删除其他jaxb.in​​dex文件,您可以使用Java类来实例化上下文:

http://docs.oracle.com/javase/6/docs/api/javax/xml/bind/JAXBContext.html#newInstance(java.lang.Class中…)

通常,您只需要传入单个java类,因为其他类“可以从这些类中静态访问”,因此JAXB能够识别它们。

在我的情况下,我能够通过在与JAXB注释类相同的包文件夹中添加名为“jaxb.in​​dex”的文件来解决此问题。 在该文件列表中,带注释的类的简单非限定名称。

例如,我的文件/MyProject/src/main/java/com/example/services/types/jaxb.in​​dex只是一行(因为我只有一个JAXB类型):

 ServerDiagContent 

它引用了类com.example.services.types.ServerDiagContent

由于ClassLoader问题我得到了这个错误,我能够通过显式传递JAXB应该使用的ClassLoader来解决它,所以这个:

 JAXBContext.newInstance(com.myexample.test.ObjectFactory.class.getPackage().getName()); 

给出了错误,但在使用时工作正常:

 JAXBContext.newInstance(com.myexample.test.ObjectFactory.class.getPackage().getName(), com.myexample.test.ObjectFactory.class.getClassLoader()); 

这可能类似于user3243752的答案,我敢打赌,当使用#newInstance(Class … classesToBeBound)方法签名时,JAXB会自动从传入的类中选择ClassLoader。

在我的情况下,我能够通过更改JAXBContext的实例化来解决问题。 它可以使用包名称实例化,也可以将ObjectFactory类实例化为参数。

使用包名实例化时:

 com.myexample.test.ObjectFactory objectFactory = new com.myexample.test.ObjectFactory(); JAXBContext jaxbContext = JAXBContext.newInstance(objectFactoryMessageBody.getClass().getPackage().getName()); 

它给出了错误:

 "com.myexample.test" doesnt contain ObjectFactory.class or jaxb.index 

使用类名实例化时没有错误:

 com.myexample.test.ObjectFactory objectFactory = new com.myexample.test.ObjectFactory(); JAXBContext jaxbContext = JAXBContext.newInstance(objectFactoryMessageBody.getClass()); 

如果你有像对象工厂的实例化

 private ObjectFactory of; 

..然后,最安全,最可靠的方法是将一个Context带到Marshall:

  JAXBElement gl = of.createGreetings( grList ); JAXBContext jc = JAXBContext.newInstance(of.getClass()); Marshaller m = jc.createMarshaller(); 

使用ObjectFactory类所在位置的完整包名称来声明实例化 Object。