【问题标题】:JaxbRepresentation gives error "doesnt contain ObjectFactory.class or jaxb.index"JaxbRepresentation 给出错误“不包含 ObjectFactory.class 或 jaxb.in​​dex”
【发布时间】:2011-08-26 09:44:12
【问题描述】:

我正在尝试创建一个将对象转换为 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)

请人帮忙!!!

【问题讨论】:

标签: java rest jakarta-ee jaxb restlet-2.0


【解决方案1】:

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

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

ServerDiagContent

指的是类 com.example.services.types.ServerDiagContent

【讨论】:

  • 这在您使用 JAXWS 生成代码时很有用
【解决方案2】:

要摆脱额外的 jaxb.in​​dex 文件,您可以使用 Java 类来实例化上下文:

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

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

【讨论】:

【解决方案3】:

我使用的是 Spring,我只需要更改

Jaxb2Marshaller mlr = new Jaxb2Marshaller();
mlr.setContextPaths("","");

Jaxb2Marshaller mlr = new Jaxb2Marshaller();
mlr.setPackagesToScan("","");

Ref1 & Ref2

【讨论】:

    【解决方案4】:

    由于 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。

    【讨论】:

    • 或者干脆做:ObjectFactory.class.getPackage().getName(),不用指定包名
    【解决方案5】:

    就我而言,我能够通过更改 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());
    

    【讨论】:

      【解决方案6】:

      如果您有对象工厂的实例化,例如

      private ObjectFactory of;
      

      ..那么最安全、最可靠的方式来获取 Marshall 的上下文是:

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

      【讨论】:

        【解决方案7】:

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

        【讨论】:

          【解决方案8】:

          我在查找对象工厂类的位置创建了一个空的 jaxb.in​​dex 文件。这解决了我的问题。

          【讨论】:

            【解决方案9】:

            我注意到应该转换为 xXSD 文件的有效负载 Java 类的包名称在 PUM 文件中的 JAXB2 插件配置中是错误的。当我纠正它时,问题就解决了。

            【讨论】:

              猜你喜欢
              • 2013-12-30
              • 2014-12-25
              • 1970-01-01
              • 2016-05-19
              • 1970-01-01
              • 2019-01-29
              • 2021-03-11
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多