java rest java-ee jaxb restlet-2.0

java - JaxbRepresentation da error "no contiene ObjectFactory.class o jaxb.index"



rest java-ee (6)

En mi caso, pude resolver el problema cambiando la instanciación del JAXBContext. Se puede crear una instancia con el nombre del paquete o la clase ObjectFactory como parámetro.

Al crear una instancia con el nombre del paquete:

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

Dio el error:

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

No hay errores al crear una instancia con el nombre de clase:

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

Intento crear una aplicación de prueba de prueba que convierta un objeto a JaxbRepresentation. Pero cuando intento ejecutar esto, me da un error.

Archivo 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(); } }

Archivo 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; } }

Archivo 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; } }

Cuando ejecuto esto en el servidor, arroja el siguiente error:

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)

Por favor, alguien ayude!


En mi caso, pude resolver esto agregando un archivo llamado "jaxb.index" en la misma carpeta del paquete que la clase anotada JAXB. En ese archivo enumere los nombres simples y no calificados de las clases anotadas.

Por ejemplo, mi archivo /MyProject/src/main/java/com/example/services/types/jaxb.index es simplemente una línea (ya que solo tengo una clase de JAXB):

ServerDiagContent

que se refiere a la clase com.example.services.types.ServerDiagContent



Recibí este error debido a un problema de ClassLoader, y pude resolverlo pasando explícitamente el ClassLoader que JAXB debería usar, así que esto:

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

dio un error, pero funcionó correctamente al usar:

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

que probablemente sea similar a la respuesta del usuario3243752, apuesto a que JAXB elige automáticamente el ClassLoader del aprobado en clase cuando usa la firma del método #newInstance (Class ... classesToBeBound).


Si tiene una instanciación de su fábrica de objetos como

private ObjectFactory of;

..entonces la forma más segura y confiable de obtener un Contexto para Marshall es:

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


Utilice el nombre completo del paquete donde está presente la clase ObjectFactory para declarar y crear una instancia del objeto.