我正在尝试创建一个将对象转换为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<SampleResponse> representation = new JaxbRepresentation<SampleResponse>(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.index文件,您可以使用Java类实例化上下文:
http://docs.oracle.com/javase/6/docs/api/javax/xml/bind/JAXBContext.html#newInstance(java.lang.Class …)
通常,您只需要传递单个Java类,因为其他类“可以从这些类静态访问”,因此JAXB能够识别它们。